あなたの質問の最初の部分は十分に他の回答で回答されています。後で呼び出すことができる関数への参照を渡すのではなく、console.log()
関数を呼び出していました。誰もがまだ対処していない、あなたの質問の後半部分に答えるために
:
をはい、それはむしろ使用$('body')
よりもボタンの近い祖先にスコープにあなたのイベントハンドラをよりよく実行します。
可能な限りボタンの近くにありますが、イベントハンドラをインストールしたときに静的に存在する(後で動的に破棄されたり作成されたりしない)ボタンの祖先を選択する必要があります。 .live()
が.on()
のために廃止されたことを
一つの主な理由は、.live()
document
オブジェクトにと忙しいページ内のすべてのそれのイベントハンドラを入れ、document
オブジェクトに委任されたイベントハンドラのLOTがあり得ることです。これが発生すると、単一のイベントがすべてdocument
オブジェクトまで泡立てられ、すべての単一のイベントを、可能な委任イベントハンドラの長いリストと比較する必要があります。これは通常、セレクタ操作とeventTarget
の実行を意味するため、実際には遅くなる可能性があります。
一方、目的のeventTargetにはるかに近い祖先オブジェクトを選択すると、はるかに小さいオブジェクトリストからのはるかに小さいリストのリストがこの特定の委任イベントハンドラとイベント全体に流れますシステムのパフォーマンスは向上します。
多くのイベント/オブジェクトで最高のパフォーマンスを得るには、委任イベントハンドラをターゲットオブジェクトのできるだけ近くに適用する必要があります。
すぐに 'console.log(" clicked ")'を実行しているので、動作しません。 '.live()'と同じ問題が発生します。関数リファレンスを渡しても問題ありません。そして、イベントハンドラは、常に実際の要素のできるだけ近くにバインドする必要があります。これはスコープではなく、子孫チェーンの長さ、つまり話すことです。 –
[ページロード時にクリックイベントハンドラがすぐに起動するのはなぜですか?](http://stackoverflow.com/questions/7102413/why-does-click-event-handler-fire-immediately-up-page-load) –
@FelixKling、その質問は、いつ発火するかについて、私の所在地と理由についてです。 console.log()は、それ自身ではなく、関数内にある必要がありました。 – SpaceNinja