Javascript 在传播期间修改事件数据
当jQuery事件对象向上传播DOM时,是否有任何方法将数据附加到它 为了澄清这一点,如果有三个嵌套的div,每个div都有一个click事件侦听器,那么单击最里面的div将导致从最里面到最外面调用所有三个处理程序(事件传播101)。我想做的是向每个处理程序中的事件对象添加一些数据,这些数据可供上一层访问Javascript 在传播期间修改事件数据,javascript,jquery,events,Javascript,Jquery,Events,当jQuery事件对象向上传播DOM时,是否有任何方法将数据附加到它 为了澄清这一点,如果有三个嵌套的div,每个div都有一个click事件侦听器,那么单击最里面的div将导致从最里面到最外面调用所有三个处理程序(事件传播101)。我想做的是向每个处理程序中的事件对象添加一些数据,这些数据可供上一层访问 如何实现这一点?尽管您不能直接将数据附加到事件,但仍然可以通过jQuery的data()将数据附加到targetElement: 这里有一个问题:jQuery传递的事件对象是本机事件对象的包装
如何实现这一点?尽管您不能直接将数据附加到事件,但仍然可以通过jQuery的
data()
将数据附加到targetElement
:
这里有一个问题:jQuery传递的事件对象是本机事件对象的包装器。冒泡发生在javascript/浏览器级别,因此本地事件对象似乎在所有事件处理程序之间共享
$('div').click(function(e) {
e.originalEvent.attribute = (e.originalEvent.attribute || "") +
" " + $(this).prop("className");
alert(e.originalEvent.attribute);
});
在Chrome、Firefox、Safari、IE9和IE10中测试。如果您在其他浏览器中进行测试,请对测试结果进行评论
问题是:也许我误解了这个问题,但我在寻找做同样事情的方法时遇到了这个StackOverflow页面 我发现您可以返回希望在每个处理程序末尾传递的值,然后使用
事件.result
属性在后续处理程序中访问它们
此解决方案在第一次触发事件时起作用,但数据通过多个事件持续存在(在JSFIDLE上,尝试单击多次,看看会发生什么)。我真的很想找到一种方法,在数据冒泡时将数据与特定的点击关联起来,而不是与特定的元素关联起来…@josh-为什么不在数据碰到最外层的元素时删除它呢。否决,因为它没有回答OP提出的问题:“将数据附加到jQuery事件对象”。投票数第二高的答案正好如此,应该排在第一位,而被接受的答案…同意这不是理想的解决方案-修改原始事件应该是被接受的答案。我刚刚在IE10/9上测试了这一点,它是有效的。这应该是正确的解决方案。糟糕,没有IE8支持。这正是我需要的,谢谢。这应该记录在MDN上。如果事件是用javascript触发的,这将破坏js(OriginaleEvent将是未定义的)。@nils javascript中的每个对象都是
expando
对象,也就是说,您可以随意附加任何内容。这不是事件系统的一个特性,而是JavaScript的一个特性,可以以这种特殊的方式使用。我不相信这是正确的答案。在事件上升到DOM的更高层之后,它对我不起作用。
$('div').click(function(e) {
e.originalEvent.attribute = (e.originalEvent.attribute || "") +
" " + $(this).prop("className");
alert(e.originalEvent.attribute);
});