jQuery & LiveQuery - проверьте, была ли функция прикреплена к элементу
Вопрос
Я запускаю это:
$("*:not(#boo) .content").livequery(function(){
$("input, select").blah();
});
blah()
Похоже:
(function( $ ) {
$.fn.blah = function(){
var that = this;
return this.each(function(){
$(this).bind('change', function(){
// do some stuff here
return true;
}).change();
});
};
})(jQuery);
И HTML выглядит как:
<div id="boo">
<div class="content">
<input type="text" />
<input type="text" />
...
</div>
</div>
<div class="content">
<input type="text" />
<input type="text" />
</div>
...
Итак, я пытаюсь сделать эту функцию и событие к каждому входному элементу, который не находится внутри #boo
Анкет Это работает, но проблема в том, что делает это, как каждую секунду снова и снова, и браузер замерзает.
Мне нужен LiveQuery, потому что HTML иногда обновляется, и мне нужно снова прикрепить событие к новым элементам.
Итак, как я могу проверить, если blah()
уже применялся к входному элементу и остановился на этом?
Решение
Когда вы запросите $.data( object, 'events' )
Вы получаете объект обратно со свойствами событий, прикрепленных к нему. Так что в вашем случае вы можете добавить это условное:
(function( $ ) {
$.fn.blah = function(){
var that = this;
return this.each(function(){
if ($.data( $(this).get(0), 'events' ) !== void(0) &&
$.data( $(this).get(0), 'events' ).change === void(0)) {
$(this).bind('change', function(){
// do some stuff here
return true;
}).change();
}
});
};
})(jQuery);
... чтобы связать функцию, только если она еще не была.
Другие советы
Я бы не стал делать это так, чтобы быть честным. Ваше первое утверждение - это большое NONO, запрашивая каждый узел в вашей разметке, а затем излучает необходимые вам элементы. Почему бы не сделать это так:
$('input').filter(function() { return !!$(this).closest('#boo').length } )
.live('change', function() {
// do some stuff here
}).change();
Это, конечно, имеет смысл, только если здесь нет ничего, что не так. Но действительно похоже, что вам даже не нужно .livequery
здесь.
Обновлять
Приведенный выше код не мог работать. Но это должно это сделать:
$('input').live('change', function() {
if(!$(this).closest('#boo').length) {
// do some stuff here
}
}).change();