Есть много вопросов о привязывании будущих манипуляций к несуществующим элементам, на которые в конечном итоге отвечает live/делегат. Мне интересно, как выполнить произвольный обратный вызов (например, добавить класс или запустить плагин) до всех существующих элементов, которые соответствуют селектору и всем будущим элементам, которые соответствуют тому же селектору, которые еще не созданы создаваться.
Похоже, что основная функциональность плагина livequery превратила его в ядро, а другая часть, добавив произвольные обратные вызовы как-то потерянные.
Другим распространенным ответом является делегирование событий, но что, если у вас нет доступа ко всему коду поставщика, который создает элементы для его trigger события?
Вот какой код реального мира:
// 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 и/или подключаться к подпрограммам jQuery DOM, чтобы установить только флаг, который должен произойти? Тогда может быть только таймер, который проверяет этот флаг каждые x секунд, только запускает все эти селекторы/обратные вызовы, когда DOM действительно изменился.
Это может быть очень плохо, если вы добавляете/удаляете элементы в больших количествах с высокой скоростью (например, с анимацией или ____). Для повторного анализа DOM один раз для каждого сохраненного селектора каждые x секунд может быть слишком интенсивным, если x является низким, и интерфейс будет казаться вялым, если x высока.
Любые другие новые решения?
Я добавлю щедрость, когда это позволит мне. Я добавил щедрость для самого нового решения!
В основном то, что я получаю, это более аспектно-ориентированный подход для управления DOM. Тот, который может позволить, чтобы новые элементы создавались в будущем, и они должны быть созданы с исходными изменениями document.ready, применяемыми к ним, а также.. p >
В последнее время JS удалось сделать так много волшебства, что я надеюсь, что это будет очевидно.