【发布时间】:2011-08-19 06:49:04
【问题描述】:
在 jQuery 事件对象向上传播 DOM 时,有什么方法可以将数据附加到它?
澄清一下,如果您有三个嵌套的 div,每个都有一个单击事件侦听器,那么单击最里面的 div 会导致从最里面到最外面调用所有三个处理程序(事件传播 101)。我想做的是在每个处理程序中的事件对象中添加一些数据,这些数据可供下一层访问。
我该怎么做?
【问题讨论】:
标签: javascript jquery events
在 jQuery 事件对象向上传播 DOM 时,有什么方法可以将数据附加到它?
澄清一下,如果您有三个嵌套的 div,每个都有一个单击事件侦听器,那么单击最里面的 div 会导致从最里面到最外面调用所有三个处理程序(事件传播 101)。我想做的是在每个处理程序中的事件对象中添加一些数据,这些数据可供下一层访问。
我该怎么做?
【问题讨论】:
标签: javascript jquery events
jQuery 传递的事件对象是原生事件对象的包装器。冒泡发生在 javascript/浏览器级别,因此本机事件对象似乎在所有事件处理程序之间共享。
$('div').click(function(e) {
e.originalEvent.attribute = (e.originalEvent.attribute || "") +
" " + $(this).prop("className");
alert(e.originalEvent.attribute);
});
在 Chrome、Firefox、Safari、IE9 和 IE10 中测试。如果您在其他浏览器中进行测试,请对结果发表评论。
【讨论】:
expando 对象,即你可以随意附加任何东西。这不是事件系统的特性,而是可以以这种特殊方式使用的 JavaScript。
虽然您不能直接将数据附加到事件中,但您仍然可以通过 jQuery 的 data() 将数据附加到 targetElement:
$('div').click(function(e) {
var info = $(e.target).data('info') || '';
$(e.target).data('info', info + ' ' + $(this).attr('class'));
});
【讨论】:
也许我误解了这个问题,但我在寻找做同样事情的方法时遇到了这个 StackOverflow 页面。
我发现您可以在每个处理程序的末尾返回您想要传递的值/值,然后使用event.result 属性在后续处理程序中访问它们?
【讨论】: