Я написал код JS, который фильтрует все изображения, размер которых превышает указанный размер. Отфильтрованный DOM подключается к событию клика.
var largeImages = allImages.filter(function(){
return ($(this).width() > 70) || ($(this).height() > 70)
});
Но теперь я также добавляю несколько фотографий в DOM с AJAX. Эти снимки имеют размер, чтобы пройти через этот фильтр, но в настоящее время не фильтруются, потому что они добавляются после фильтрации DOM.
Теперь у меня есть два вопроса:
Есть ли какая-либо "живая" функция фильтра в jQuery, которая фильтрует DOM live и добавляет также новые добавленные элементы в массив?
Если эта функция не существует. Как я могу наблюдать для изменений DOM, чтобы снова запустить этот фильтр?
UPDATE: у меня нет возможности привязываться к событию, которое добавляет фотографии. Я работаю над расширением Chrome, которое дает некоторые варианты работы с фотографиями.
Если вам нужно отслеживать изменения в доме для повторного запуска вашего фильтра, и они предназначены только для хром (это расширение хром), тогда вы можете использовать наблюдатели-мутации DOM
Затем, когда изменения dom, вы можете повторно запустить свой фильтр. Что-то вроде этого:
var observer = new MutationObserver(function(){
// run your filter here
});
observer.observe(document);
Вы можете использовать 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;
});
});
Но то же самое можно было бы сделать и при следующем (просто повторный 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;
});
});
Рекомендации:
Вы должны привязать событие, которое добавляет новые изображения, то есть функцию обратного вызова вашего вызова AJAX.
live
, этоon
, но вы должны использовать его для будущих событий. Документы JQuery достаточно объяснить, как.