Быстро выбрать все элементы с фоновым изображением CSS - PullRequest
11 голосов
/ 10 февраля 2011

Я хочу получить все элементы на странице с фоновым изображением css. Я могу сделать это с помощью функции фильтра, но это очень медленно на странице со многими элементами:

$('*').filter(function() {
    return ( $(this).css('background-image') !== '' );
}).addClass('bg_found');

Есть ли более быстрый способ выделения элементов с фоновыми изображениями?

1 Ответ

19 голосов
/ 10 февраля 2011

Если есть какие-либо теги, которые, как вы знаете, не будут иметь фонового изображения, вы можете улучшить выделение, исключив теги с not-selector (документы) .

$('*:not(span,p)')

Кроме этого, вы можете попробовать использовать более нативный подход API в фильтре.

$('*').filter(function() {
    if (this.currentStyle) 
              return this.currentStyle['backgroundImage'] !== 'none';
    else if (window.getComputedStyle)
              return document.defaultView.getComputedStyle(this,null)
                             .getPropertyValue('background-image') !== 'none';
}).addClass('bg_found');

Пример: http://jsfiddle.net/q63eU/

Код в фильтре основан на коде getStyle: http://www.quirksmode.org/dom/getstyles.html


Публикация версии оператора for, чтобы избежать вызовов функций в .filter().

var tags = document.getElementsByTagName('*'),
    el;

for (var i = 0, len = tags.length; i < len; i++) {
    el = tags[i];
    if (el.currentStyle) {
        if( el.currentStyle['backgroundImage'] !== 'none' ) 
            el.className += ' bg_found';
    }
    else if (window.getComputedStyle) {
        if( document.defaultView.getComputedStyle(el, null).getPropertyValue('background-image') !== 'none' ) 
            el.className += ' bg_found';
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...