2011-08-19 14 views
26

当数据传播到DOM时,是否有任何方法将数据附加到jQuery事件对象?为了澄清,如果您有三个嵌套div,每个都有一个click事件监听器,那么单击最内层的div会导致从最内层到最外层(事件传播101)调用的所有三个处理程序。我想要做的是将一些数据添加到每个可供下一层访问的处理程序中的事件对象。我怎么做?在传播过程中修改事件数据

谢谢。

回答

2

也许我误解了这个问题,但我碰到这个StackOverflow的网页来了,同时寻找一种方式做同样的事情。

我已经发现您可以返回您想要在每个处理程序结束时传递的值,然后在后续处理程序中使用event.result属性访问它们?

http://api.jquery.com/event.result/

4

虽然无法直接连接数据的情况下,你仍然可以通过jQuery的data()附加数据到targetElement

$('div').click(function(e) { 
    var info = $(e.target).data('info') || ''; 
    $(e.target).data('info', info + ' ' + $(this).attr('class')); 
}); 

这里的小提琴:http://jsfiddle.net/eKVmU/

+0

该解决方案简单的演示作品第一次在事件被触发,而是通过多个事件中的数据仍然存在(在的jsfiddle,试着点击多次,看看会发生什么)。真的会喜欢一种将数据与特定的点击相关联的方式,因为它会起泡,而不是特定的元素... – josh

+0

@josh - 为什么不直接删除数据,当它击中最外层的元素? [见这里](http://jsfiddle.net/eKVmU/7/)。 –

+0

Downvoted,因为它不回答OP询问的问题:“将数据附加到jQuery事件对象”。第二个最高的投票答案就是这样,应该是顶部,并接受答案... –

36

由jQuery的传递的事件对象是本地事件对象的包装。冒泡发生在JavaScript /浏览器级别,因此本地事件对象似乎在所有事件处理程序之间共享。

$('div').click(function(e) { 
    e.originalEvent.attribute = (e.originalEvent.attribute || "") + 
     " " + $(this).prop("className"); 
    alert(e.originalEvent.attribute); 
}); 

在Chrome,Firefox,Safari,IE9和IE10中测试。如果您在其他浏览器中测试,请对结果进行评论。

这里的小提琴:http://jsfiddle.net/5AQqD/

+2

我刚刚在IE10/9上测试它,它作品。这应该是正确的解决方案。 –

+0

无赖,没有IE8的支持。 – johntrepreneur

+0

这正是我需要的,谢谢。这应该记录在MDN上。 – nils