2011-04-05 87 views
1

因此,我使用事件冒泡来捕获子DOM事件...我将点击事件附加到div包装器,并附加单击事件到包装的孩子......像这样:无法将属性分配给Internet Explorer中的window.event(或数据属性)

<div onclick="foo();"> 
    <div onclick="bar();"> 
     Hello World! 
    </div> 
</div> 

function foo() { 
    alert(window.event.abc.one); 
}; 

function bar() { 
    window.event.abc = {one: "23"}; 
}; 

正如你所看到的,我指定一个自定义对象abc。我使用这种方式发送消息来点击处理链上的处理程序......并避免在每个子元素上使用闭包。在其他浏览器中,您可以将任何您喜欢的内容指定给event对象......并且这种方式非常有效。

但是(当然),这在IE中不起作用。我尝试在事件对象上使用“data”属性,但这只允许字符串。

任何其他方式我可以完成相同的功能,而无需在每个子对象上使用闭包?

回答

2

不漂亮,但这应该工作。 Box9 the magnificent建议我忽略了一些东西,也就是说,如果某物在气泡到达bar()之前设置了某个属性(例如,您的内部div的后代的事件处理程序),它将被覆盖。

var msg = {}; 

// When the event bubbles up to document, we'll reset it to an empty object 
// literal, ready for new information to be attached to it. 
document.onclick = function() { msg = {} }; 

function foo() { 
    alert(msg.one); 
}; 

function bar() { 
    // Assign this property only, so if something else had attached a property 
    // to `msg`, it will remain intact. 
    msg.one = "23"; 
}; 
+0

也许你可以在'document.onclick'上分配'msg = {}'。然后,您不需要知道哪个事件处理程序触发器(如果有多个图层)。 – 2011-04-05 01:15:06

+0

@ Box9干杯,我可能只是用'{}'来定义它(我错过了什么)? – alex 2011-04-05 01:18:15

+1

不完全是我的意思,尽管我只是猜测OP想要什么。我想象着一系列事件处理程序,每个事件处理程序都会向事件添加数据,因为它会起泡,而不仅仅是一个。如果有'bar'元素的子元素,那么在'bar'中分配一个新对象将会替换由子元素添加的任何值。不是初始化最低元素处的msg对象,你可以先初始化它,然后在它起泡到“文档”时重置它,为下一个事件做好准备。 – 2011-04-05 01:24:53

相关问题