質問:
ページ上のすべての選択ボックスに対して.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(){ });
|
イベントがバインドされる時点で存在するすべての親でうまくいくよ。例えば
$('.buttons').on('click', 'button', function(){ });
|
は以下に適用される
<div class="buttons"> <!-- <button>は動的に生成され、ここに追加される --> </div>
|
回答2:
これは、ライブラリやプラグインを使用しない純粋なJavaScript での方法だよ。
document.addEventListener('click', function (e) { if (hasClass(e.target, 'bu')) { } else if (hasClass(e.target, 'test')) { } }, false);
|
ここで hasClassは
function hasClass(elem, className) { return elem.className.split(' ').indexOf(className) > -1; }
|
ライブデモ
回答3:
オブジェクトを作成するときにイベントを追加することができるよ。君が同じイベントを複数のオブジェクトに異なるタイミングで追加している場合なら、名前付き関数を作成するのがいいかも:
var mouseOverHandler = function() { }; var mouseOutHandler = function () { }; $(function() { $('select').hover(mouseOverHandler, mouseOutHandler); }); $("<select></select>") .append( ) .hover(mouseOverHandler, mouseOutHandler) .appendTo( ) ;
|
By
nickf | 回答日時: 2008年10月14日 23:31
Source: Event binding on dynamically created elements?