複数のイベントをバインドするために、レバレッジjQueryの.on()(ex-live())を作成しようとしています。document.readyに存在する要素に対して機能していますが、ページの読み込み後に2番目のリンクを動的に追加すると、イベントハンドラーがトリガーされません。
最も外側のメソッドが要素を反復処理し、新しく追加されたDOMノードなどをリッスンするのでこれは理にかなっています。.on(..)は新しいDOMノードをリッスンするものですが、イベント名paramsが必要です。 DOMノードができるまで持っています。
ひよこと卵のような状況のようです。
考え?
<a href="/foo.html" class="js-test" data-test-events="['click', 'mouseover']">Test 1</a>
<a href="/foo.html" class="js-test" data-test-events="['mouseout']">Test 2</a>
$(function() {
$('.js-test').each(function() {
var $this = $(this);
var e, events = $this.data('test-events');
for(e in events) {
$this.on(events[e], function() {
console.log("hello world!")
});
}
});
});
更新、以下も機能するようです。$(this)は正しいスコープにないようです。
<a href="/foo.html" class="js-test" data-test-events="click mouseover">Test 1</a>
<a href="/foo.html" class="js-test" data-test-events="mouseout">Test 2</a>
$(function() {
$('.js-test').on($(this).data('test-events'), function() {
// call third party analytics with data pulled of 'this'
});
});
アップデート1:
私の最善の策は、次のようにサポートしたいすべてのメソッドに対して特別な.onメソッドを作成することだと思います。
$(document).on('click', '.js-test[data-test-events~="click"]' function(event) {
record(this, event);
});
$(document).on('mouseover', '.js-test[data-test-events~="mouseover"]', function(event) {
record(this, event);
});
... etc ...