jQuery& livequery - 检查函数是否已附加到元素

时间:2011-01-31 09:44:16

标签: 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>
...

所以我要做的就是附上那个功能&amp;事件到不在#boo内的每个输入元素。 这是有效的,但问题是这样做是一遍又一遍,浏览器会冻结。

我需要livequery,因为html有时会更新,我需要再次将事件附加到新元素。

那么如何检查blah()是否已经应用于输入元素并停在那里?

2 个答案:

答案 0 :(得分:2)

说实话,我不这样做。您的第一个语句是一个很大的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();

答案 1 :(得分:1)

当您查询$.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);

...以便仅绑定函数(如果尚未绑定)。