jQuery & LiveQuery - проверьте, была ли функция прикреплена к элементу

StackOverflow https://stackoverflow.com/questions/4849407

  •  27-10-2019
  •  | 
  •  

Вопрос

Я запускаю это:

$("*: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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top