2012-04-15 13 views
0

live()が推奨されないため、on()に問題があります。on()を使用して、動的に作成される要素にイベントハンドラをアタッチします。

これは動作していないよう:

$('body').on("click", ".myButton", console.log("clicked")); 

私はページを更新すると、コンソールはすぐに私は何もクリックされていないにもかかわらず、「クリックした」と言うが、私は実際にクリックしたときに発生しません。それ。

また、これはBODYの巨大なスコープではなく、ボタンが入っているDIVにこれを適用する方が効果的です。これは本当ですか?

+1

すぐに 'console.log(" clicked ")'を実行しているので、動作しません。 '.live()'と同じ問題が発生します。関数リファレンスを渡しても問題ありません。そして、イベントハンドラは、常に実際の要素のできるだけ近くにバインドする必要があります。これはスコープではなく、子孫チェーンの長さ、つまり話すことです。 –

+0

[ページロード時にクリックイベントハンドラがすぐに起動するのはなぜですか?](http://stackoverflow.com/questions/7102413/why-does-click-event-handler-fire-immediately-up-page-load) –

+0

@FelixKling、その質問は、いつ発火するかについて、私の所在地と理由についてです。 console.log()は、それ自身ではなく、関数内にある必要がありました。 – SpaceNinja

答えて

2
$('body').on("click", ".myButton", function() { 
    console.log("clicked") 
}); 
+0

ありがとう!すぐに呼び出さないように関数にラップしてください。 – SpaceNinja

2

あなたが実際にその行にconsole.logを呼び出しているために表示されている奇妙な動作です。それを関数にラップする必要があります。

function() { console.log('clicked'); } 
+0

jQuery 1.7以降、.delegate()は.on()メソッドに取って代わられました。 –

+0

どうしたらいいですか... – nickf

+0

ああ、私は理解しています。あなたよ、NickF! – SpaceNinja

3
$(function(){ 
    $('body').on("click", ".myButton",function(){ 
     alert("clicked"); 
    }); 
}); 
2

あなたの質問の最初の部分は十分に他の回答で回答されています。後で呼び出すことができる関数への参照を渡すのではなく、console.log()関数を呼び出していました。誰もがまだ対処していない、あなたの質問の後半部分に答えるために

をはい、それはむしろ使用$('body')よりもボタンの近い祖先にスコープにあなたのイベントハンドラをよりよく実行します。

可能な限りボタンの近くにありますが、イベントハンドラをインストールしたときに静的に存在する(後で動的に破棄されたり作成されたりしない)ボタンの祖先を選択する必要があります。 .live().on()のために廃止されたことを

一つの主な理由は、.live()documentオブジェクトにと忙しいページ内のすべてのそれのイベントハンドラを入れ、documentオブジェクトに委任されたイベントハンドラのLOTがあり得ることです。これが発生すると、単一のイベントがすべてdocumentオブジェクトまで泡立てられ、すべての単一のイベントを、可能な委任イベントハンドラの長いリストと比較する必要があります。これは通常、セレクタ操作とeventTargetの実行を意味するため、実際には遅くなる可能性があります。

一方、目的のeventTargetにはるかに近い祖先オブジェクトを選択すると、はるかに小さいオブジェクトリストからのはるかに小さいリストのリストがこの特定の委任イベントハンドラとイベント全体に流れますシステムのパフォーマンスは向上します。

多くのイベント/オブジェクトで最高のパフォーマンスを得るには、委任イベントハンドラをターゲットオブジェクトのできるだけ近くに適用する必要があります。