ダイナミックに作成された要素のイベントバインド [Javascript]

このエントリーをはてなブックマークに追加

質問:

ページ上のすべての選択ボックスに対して.hoverイベントをバインドして、オンマウスかどうかによってその幅を少し変えるようなコードが有るんだけど、これはページの準備ができた時点ではうまく動作してる。

で、問題なのは、AjaxまたはDOMを介して追加した選択ボックスだとイベントがバインドされない、ってことなんだ。

幸いこのプラグイン(jQuery Live Queryプラグイン)を見つけたんだけど、僕のページにプラグインを追加する前に、誰かjQueryを使うか、別の方法かでこの問題を解決する方法を知ってる人がいないかなって聞きたいと思ったんだ。誰かいいアイデア無い??

By Eli | 質問日時: 2008年10月14日 23:25



回答1:

jQuery 1.7以降 jQuery.fn.onが使える

$(staticAncestors).on(eventName, dynamicChild, function() {});

**これよりも推奨されるべきアプローチはlive()かな:

$(selector).live( eventName, function(){} );

でも、 live()on()のせいでに1.7では廃止され、1.9で完全に除去された。
live()はこう書けるけど:

$(selector).live( eventName, function(){} );

でも以下のon()に置き換えることができる。

$(document).on( eventName, selector, function(){} );

たとえば、あるページがクラス名dosomethingを持つ要素を動的に作成していたとすると、、イベントはすでに存在する親にバインドされてる。

$(document).on('mouseover mouseout', '.dosomething', function(){
    //マウスオーバーやマウスアウト時に何をしたいか
    // '.dosomething'と一致する要素で発生する
});

イベントがバインドされる時点で存在するすべての親でうまくいくよ。例えば

$('.buttons').on('click', 'button', function(){
        //ここで何かする
});

は以下に適用される

<div class="buttons">
<!-- <button>は動的に生成され、ここに追加される -->
</div>


回答2:

これは、ライブラリやプラグインを使用しない純粋なJavaScript での方法だよ。

document.addEventListener('click', function (e) {
if (hasClass(e.target, 'bu')) {
          // .buがクリックされた
          // 何かやる
} else if (hasClass(e.target, 'test')) {
// .testがクリックされた
// 何か他のことやる
}
}, false);

ここで hasClass

function hasClass(elem, className) {
return elem.className.split(' ').indexOf(className) > -1;
}

ライブデモ

By Ram Patra | 回答日時: 2014年12月9日 7:59



回答3:

オブジェクトを作成するときにイベントを追加することができるよ。君が同じイベントを複数のオブジェクトに異なるタイミングで追加している場合なら、名前付き関数を作成するのがいいかも:

var mouseOverHandler = function() {
// 何かやる
};
var mouseOutHandler = function () {
// 何かやる
};
$(function() {
    //ドキュメントの読み込み時に、既存の要素に適用する
$('select').hover(mouseOverHandler, mouseOutHandler);
});
///この次の部分はAjax呼び出しのコールバックにある
$("<select></select>")
.append( /* 君の<option>s */ )
.hover(mouseOverHandler, mouseOutHandler)
.appendTo( /* 選択ボックスが必要な場合はどこでも*/ )
;

By nickf | 回答日時: 2008年10月14日 23:31



Source: Event binding on dynamically created elements?

共有 コメント