Живая DOM-фильтрация с помощью jQuery

0

Я написал код JS, который фильтрует все изображения, размер которых превышает указанный размер. Отфильтрованный DOM подключается к событию клика.

var largeImages = allImages.filter(function(){  
    return ($(this).width() > 70) || ($(this).height() > 70)  
}); 

Но теперь я также добавляю несколько фотографий в DOM с AJAX. Эти снимки имеют размер, чтобы пройти через этот фильтр, но в настоящее время не фильтруются, потому что они добавляются после фильтрации DOM.

Теперь у меня есть два вопроса:

  1. Есть ли какая-либо "живая" функция фильтра в jQuery, которая фильтрует DOM live и добавляет также новые добавленные элементы в массив?

  2. Если эта функция не существует. Как я могу наблюдать для изменений DOM, чтобы снова запустить этот фильтр?

UPDATE: у меня нет возможности привязываться к событию, которое добавляет фотографии. Я работаю над расширением Chrome, которое дает некоторые варианты работы с фотографиями.

  • 3
    Можете ли вы не просто фильтровать после добавления фотографий?
  • 0
    Существует live , это on , но вы должны использовать его для будущих событий. Документы JQuery достаточно объяснить, как.
Показать ещё 4 комментария
Теги:
filter
dom
google-chrome-extension

3 ответа

1

Если вам нужно отслеживать изменения в доме для повторного запуска вашего фильтра, и они предназначены только для хром (это расширение хром), тогда вы можете использовать наблюдатели-мутации DOM

Затем, когда изменения dom, вы можете повторно запустить свой фильтр. Что-то вроде этого:

var observer = new MutationObserver(function(){
    // run your filter here
});
observer.observe(document);
  • 0
    Это выглядит хорошо, спасибо!
  • 0
    @Reflic, если это сработает, не забудьте нажать эту зеленую галочку.
Показать ещё 1 комментарий
0

Вы можете использовать live nodeList, а затем получить доступ к этой переменной; например:

var images = document.getElementsByTagName('img');

Будет постоянно отслеживать изображения, включая новые изображения, добавленные в документ. Конечно, этот подход означает, что вы должны фильтровать этот nodeList каждый раз, когда вы добавляете другой img на страницу. В то время как это возможно, следствие состоит в том, что вы можете просто повторно выбрать соответствующие элементы при добавлении их на страницу. Однако один подход:

var images = document.getElementsByTagName('img');
$('#addImage').click(function(e){
    e.preventDefault();
    $('<img />', {
        'src' : 'http://placekitten.com/150/150/',
        'height' : '150px',
        'width' : '150px'
    }).insertAfter('#count');
    $('#count').text(function(){
        // using Array.prototype.filter() to filter the array:
        return [].filter.call(images, function(a){
            return a.naturalWidth > 70;
        }).length;
    });
});

Демо-версия JS Fiddle.

Но то же самое можно было бы сделать и при следующем (просто повторный img элементов img после добавления):

$('#addImage').click(function(e){
    e.preventDefault();
    $('<img />', {
        'src' : 'http://placekitten.com/150/150/',
        'height' : '150px',
        'width' : '150px'
    }).insertAfter('#count');
    $('#count').text(function(){
        return $('img').filter(function(){
            return this.naturalWidth > 70;
        }).length;
    });
});

Демо-версия JS Fiddle.

Рекомендации:

0

Вы должны привязать событие, которое добавляет новые изображения, то есть функцию обратного вызова вашего вызова AJAX.

  • 0
    Downvoter, пожалуйста, прокомментируйте, что не так с этим ответом.
  • 1
    Пожалуйста, оставляйте комментарии в разделе комментариев. Люди, которые могут опубликовать полный ответ, могут пропустить этот вопрос, потому что он отображается в списке как имеющий ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню