2011-01-31 5 views
2

に添付されているかどうかを確認: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> 
... 

私がしようとしていることは、その機能をすべてのinpuに接続することです。& t要素は#booの中にありません。 これはうまくいきますが、問題は毎秒何度も何度もやっているので、ブラウザがフリーズするということです。

htmlが時々更新されるので私はlivequeryが必要です。新しい要素にイベントを再度添付する必要があります。

入力要素にblah()が既に適用されているのを確認するにはどうすればいいですか?

答えて

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); 

...まだない場合は、関数をバインドするだけです。

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(); 
+0

彼女は#booにない人しか望んでいないので、あなたのフィルタ関数にはただ1つの '!'しかないはずです...とにかく、+1 – mVChr

関連する問題