次のような関数があるとします。
document.someElement.click = function(){alert(555);}
someElement
HTMLページ自体の要素にないのでsomeElement
、ページに追加した後、前のコードは機能しません。
(新しい)動的に追加されたHTML要素にイベントリスナーを追加する最良の方法は何ですか?
次のような関数があるとします。
document.someElement.click = function(){alert(555);}
someElement
HTMLページ自体の要素にないのでsomeElement
、ページに追加した後、前のコードは機能しません。
(新しい)動的に追加されたHTML要素にイベントリスナーを追加する最良の方法は何ですか?
ここには 2 つの一般的な戦略があります。
要素を DOM に追加した後、要素にイベントをフックします。
イベント委任を使用します。
1 つ目はかなり単純なので、2 つ目に焦点を当てます。
イベント委譲の考え方は、ほとんどの DOM イベントは、発生した要素からドキュメントまで「バブル」し、任意のレベルで処理できるというものです。
たとえば、あなたが持っているとします
<div id="container">
</div>
コンテナ div でイベントをフックできclick
ます。次に、次のようにすると:
var span = document.createElement('span');
span.innerHTML = "Hi there";
document.getElementById("container").appendChild(span);
...次に、 をクリックするspan
と、イベントがコンテナーにバブルアップし、コンテナーのclick
ハンドラーでクリックが表示されます。
target
オブジェクトのプロパティを使用して、どの要素がイベントを開始したかを知ることができevent
ます。
次に例を示します。
HTML:
<button id="theButton">Click To Add</button>
<div id="container"></div>
JavaScript:
// Note that this code is at the end of the document
(function() {
var container = document.getElementById("container");
// Hook clicks on the button
document.getElementById("theButton").onclick = buttonClick;
// Hook clicks on the container
container.onclick = containerClick;
// Handle button clicks
function buttonClick() {
var child = document.createElement('div');
child.id = ('d' + container.childNodes.length) +
Math.floor(Math.random() * 10000);
child.innerHTML = "I'm child div '" + child.id + "'";
container.appendChild(child);
}
// Handle container clicks
function containerClick(event) {
event = event || window.event;
alert("You clicked child '" + event.target.id + "'");
}
})();
注: 私はonclick
物事をシンプルに保つために使用してきました。本番環境では、addEventListener
(またはattachEvent
IE で) を使用することをお勧めします。実際、私は通常、jQuery、YUI、Closure、またはそれらが提供する重要なユーティリティ機能 ( /のスムージングを含む) のために他のいくつかのいずれかのような優れたライブラリを使用することをお勧めします。addEventListener
attachEvent
addEventListener()
( IE の場合) を使用attachEvent()
して、新しく作成された要素にクリック ハンドラーを登録できます。次に例を示します。
var x = document.createElement('div');
x.innerText = 'click me';
x.addEventListener('click', function() {
alert('i am clicked');
});
document.body.appendChild(x);
アップデート
TJの答えを見てください。彼は基本的に、クリック ハンドラーを定義するコンテナーをセットアップできると言っています。内部に追加されたすべての要素は、そのイベントをコンテナーにバブルアップさせます。このように、要素ごとに 1 つではなく、1 つのクリック ハンドラーのみが必要です。