2011-07-25 7 views
3

jqueryのlive()と同様の機能を持つイベントハンドラ用の純粋なjavascript関数をどこでも取得できますか?まだ作成されていないオブジェクトにイベントをアタッチする機能が必要ですが、jquery-livequeryとjquery-eventsの両方のソースは、jqueryコアの依存性のために有用ではありません。jqueryライブ関数のシンプルなバージョン

+0

はい、可能ですか?Jqueryはjavascript言語で作成されたライブラリです。 自己のすべての機能は、書き直すことができます –

+0

なぜこの車輪を再発明していますか?この関数のjQueryに依存していると何が問題になりますか? – Sparky

+0

新しい要素をページに追加するためにどのような方法を使用していますか?要素を追加する同じコードでイベントを配線できないのはなぜですか? – ErikE

答えて

7

イベントの委任は非常に簡単です。この例を見てみましょう:

マークアップ:

<div id="container"> 
    <p>Test</p> 
    <p>Test</p> 
    <p>Test</p> 
</div> 

<button id="add">Add new paragraph</button> 

スクリプト:

document.getElementById("container").onclick = function(e) { 

    // e.target is the target of the event or "source element" 
    alert(e.target.innerHTML); 
}; 

// dynamically adds new paragraph on button click 
document.getElementById("add").onclick = function() { 
    var p = document.createElement("p"); 
    p.innerHTML = "a new paragraph"; 
    document.getElementById("container").appendChild(p); 
}; 

イベントハンドラが親に取り付けられているので、それが挿入され、将来の要素のために動作します。

You can try it here.

便利な参照:

1

jQueryのは、純粋なJavaScriptとオープンソースですので、ちょうどあなたが必要なものをコピーし、元に見てそれを適応させる。

+0

+1それはすでにクロスブラウザでテストされていることは言うまでもありません。より大きな目的を果たしていないときに人々が「ホイールを再発明する」必要性を感じている理由はわかりません。 – Sparky

+0

私はその好奇心が強いと思っています;しかし、一方でIEのオッズとエンドだけを扱うと病気になります; –

+7

jQueryのあまり多くは、通常のDOM操作のようには見えません。それはそれ自身のミニプラットフォームの上に非常に多くのレイヤーで構築されているので、DOM呼び出しが実際に比較的簡単なjQuery操作で作られたものを理解することは間違いなく困難です。私はこれがjQueryには悪いと言っているわけではありません。あなたの提案はjQueryで考えるほど簡単ではありません。実際にDOMを呼び出してから、実際にDOMを呼び出してからjQueryをコピーしたり移動したりするのは簡単ではありません。 @ karim79の答えははるかに役立ちます。 – jfriend00

2

はい、これはイベントの委任と呼ばれ、jQueryと「live」よりも長く続きました。

"live"は、本体またはドキュメントのイベントをリッスンすることで動作し、イベントが発生したときに、event.targetを参照してセレクタがキャッシュに格納されているセレクタと一致するかどうかを確認します。非常に非効率的ですが、一部の人にとっては問題ありません。

より効率的なアプローチでは、リスナーに必要な要素を配列に追加し、イベントを委譲する要素の最も共通の祖先でバブリングイベントを待ち受けます。 body要素はフォールバックですが、それは最も効率が悪いです。リスナーが待機中のイベントを取得すると、event.targetが配列内の要素の1つであるかどうかを確認し、そうであれば、要素がの関連関数をこのとして呼び出します。

要素idをオブジェクトのプロパティとして格納するだけで、要素をたくさん持っている場合の検索が高速になり、クラスに基づいてイベントを登録することもできます。

いくつかの制限と弱点があります(いくつかのブラウザではいくつかのバブルがありますが、バブルはありません)。非常に非効率的な場合がありますので注意して使用してください。

+0

+1のパフォーマンス上の懸念と、非バブリングのイベントとブラウザ実装の不一致に関する注意の言葉。 – CMS

+0

jQueryの.live拡張機能に関する興味深い記事があります。なぜなら[なぜあなたはjQuery Liveを使用しないのですか](http://jupiterit.com/news/why-you-should-never-use-jquery-live)です。詳細の多くはイベントの委任に一般的に適用されます。 – RobG

1

私はJqueryとあなたの機能がほとんど分かりません。 JavaScriptでイベントの仕組みを見ていますか?

element.addEventListener('onclick', 
function() { 
    //do something 
}); 

または

element.onclick = 
function() { 
    //do something 
}); 

element varは、DOMドキュメントの参照です: あなたは、このことができます。詳細については、 チェックhttps://developer.mozilla.org/en/DOMをご確認ください。