Существует много вопросов о привязке будущих манипуляций к несуществующим элементам , на которые все в итоге получили ответ live / делегат . Мне интересно, как запустить произвольный обратный вызов (например, чтобы добавить класс или запустить плагин) до всех существующих элементов, которые соответствуют селектору, и всех будущих элементов, которые соответствуют этому же селектору которые еще не созданы.
Кажется, что основная функциональность плагина livequery превратила его в ядро, но другая часть, прикрепляющая произвольные обратные вызовы, каким-то образом затерялась.
Другим распространенным ответом является делегирование события , но что, если у человека нет доступа ко всему коду поставщика, создающему элементы для его запуска событий?
Вот некоторый реальный код:
// with livequery
$('input[type=text], input[type=password], textarea, .basic_form .block select, .order_form .form_item select, .order_form .form_item input')
.livequery(function(){
$(this)
.focus(function(){
$(this).addClass('active');
})
.blur(function(){
$(this).removeClass('active');
})
.addClass('text');
});
// with live
$('input[type=text], input[type=password], textarea, .basic_form .block select, .order_form .form_item select, .order_form .form_item input')
.live('focus', function(){
$(this).addClass('active');
})
.live('blur', function(){
$(this).removeClass('active');
});
// now how to add the class to future elements?
// (or apply another plugin or whatever arbitrary non-event thing)
Один из подходов состоит в том, чтобы отслеживать, когда новые узлы добавляются / удаляются, и повторно запускать наши селекторы. Благодаря @ arnorhs мы знаем о событии DOMNodeInserted , которое я игнорировал бы кросс-браузерную проблему в надежде, что эти небольшие исправления IE когда-нибудь попадут вверх по течению к jQuery или будут знать jQuery. Функции DOM могут быть упакованы.
Даже если бы мы могли гарантировать, что DOMNodeInserted запустил кросс-браузер, было бы смешно связывать его с несколькими селекторами. Сотни элементов могут быть созданы в любое время, и выполнение десятков вызовов селектора для каждого из этих элементов будет сканироваться.
Моя лучшая идея на данный момент
Может быть, было бы лучше проконтролировать DOMNodeInserted / Deleted и / или подключиться к подпрограммам манипулирования DOM в jQuery, чтобы установить только флаг того, что должно произойти «re-init»? Тогда может существовать таймер, который проверяет этот флаг каждые x секунд, и запускает все эти селекторы / обратные вызовы, когда DOM действительно изменился.
Это может быть очень плохо, если вы добавляете / удаляете элементы в большом количестве с высокой скоростью (например, с анимацией или ____). Необходимость повторного анализа DOM один раз для каждого сохраненного селектора каждые х секунд может быть слишком интенсивной, если х низкий, и интерфейс будет казаться вялым, если х высокий.
Какие-нибудь другие новые решения?
Я добавлю вознаграждение, когда оно позволит мне. Я добавил вознаграждение за самое новое решение!
По сути, я имею в виду более аспектно-ориентированный подход к управлению DOM. Тот, который может позволить, что новые элементы будут созданы в будущем , и они должны быть созданы с исходным документом. Для них также применены модификации .
В последнее время JS мог творить столько магии, что я надеюсь, это станет очевидным.