5

グローバルプラグイン(または少なくとも、より幅広いイベントにバインドするプラグイン)があるシナリオがあるとします。

このプラグインはセレクターを受け取り、ライブクリックをそれにバインドします。次のように見える可能性のある疑似jqueryの何か:

$.fn.changeSomething = function(){
     $(this).live("change", function(){ alert("yo");});
}

別のページに、次のような追加のライブバインディングがあります。

$("input[type='checkbox']").live("click", function(){alert("ho");});

このシナリオでは、チェックボックスは理想的には両方のライブイベントにバインドされます。

私が見ているのは、変更イベントが正常に発生し、「よ」と警告されていることです。ただし、このライブクリックイベントを使用して、トリガーすることはありません。ただし、明示的なクリックバインディングを使用して、私はそれをヒットします。

簡単な回避策は、ライブ変更ハンドラーの最後でクリックイベントをトリガーすることですが、これは私にはぎこちないようです。何か案は?

これはjquery1.4.2を使用しており、IE8でのみ発生することに注意してください(6/7もそうなると思いましたが、テストしていません)。

例(jquery-1.4.2.min.jsが必要です):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<script src="jquery-1.4.2.min.js" type="text/javascript"></script>
<script type="text/javascript">
    $.fn.changeSomething = function(){
        var t = $(this);
        t.live("change", function(){
            alert("yo");
        }); 
    };

    $(document).ready(function(){
    $("input[type='checkbox']").changeSomething();
    $("#special").live("click", function(){
      alert("ho");
    });
    });
</script>
</head>
<body>
<form>
  <input type="checkbox" id="cbx" />
  <input type="checkbox" id="special" />
  </form>
</body>
</html>
4

3 に答える 3

5

チェックボックスがフォーカスを失うまで、IEは「変更」イベントを発生させないことをご存知ですか?

それは本当だと思いますが、そのテストページからの効果はかなり奇妙です。私はまだそれで遊んでいます。「ライブ」メカニズムは、その価値を完全に理解していますが、私を混乱させ、少し緊張させます。

(少し変更して明確にした)テストページをアップしました:http://gutfullofbeer.net/clicks.htmlそしてjQueryのデバッグを開始します

トワイライトゾーン:コメントに記載されているように、ダミーの「変更」ハンドラーをbody要素にバインドすると次のようになります。

$('body').bind('change', function() { return true; });

その後、物事は正常に動作し始めます。@Alexが正しいこと、jQueryが「変更」イベントのバブリングを偽造しようとしている方法で何かが起こっていることを確信しています。しかし、まだ不気味です。テストページはhttp://gutfullofbeer.net/clicks-body.htmlにあり、「最初に変更ハンドラーを使用してセットアップ」をクリックしてからチェックボックスをクリックし、2番目の「クリック」ハンドラーに注意してください。 1つだけが起動し、[ハンドラーを本体にバインドする]をクリックして、その後のチェックボックスの動作を確認します。

于 2010-03-08T23:47:34.717 に答える
1

$.delegate代わりに共通の祖先で使用してみてください$.live

覚えておくべき重要なlive点は、イベントが選択した要素にバインドされていないことです。バインドされdocument、イベントがドキュメントにバブルすると、イベントターゲットで渡したセレクターと照合されます。

それから学ぶための鍵は、IEでは、ほとんどのブラウザーのように、変更イベントが自然にバブルしないことです。IEでは、他のブラウザの実際のイベントと同じようにすべてのjqueryテストで機能するヒューリスティックに基づくイベント「バブル」。他の関数に、このヒューリスティックの動作を停止させている何かがある可能性があります。したがって、IE固有であることは理にかなっています。それは良いことではありません...

于 2010-03-09T00:04:51.460 に答える
0

jquery.livequeryプラグインを使用できます

$("select[name='majorsList']").livequery("change",function()
{
alert('in');
});
于 2010-11-19T09:50:03.873 に答える