我正在尝试创建利用 jQuery 的 .on() (ex-live()) 来绑定多个事件。它适用于 document.ready 上存在的元素,但如果我在页面加载后动态添加第二个链接,则不会触发我的事件处理程序。
这是有道理的,因为最外层的方法会遍历元素,并且不会监听新添加的 DOM 节点等。 .on(..) 是监听新 DOM 节点的方法,但需要一个事件名称参数,我不需要直到我拥有 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 ...