我有以下功能:
function toggleContent()
{
var parent = this.parentElement;
toggleClass(parent,"detailsAreVisible");
}
当用户单击某个按钮时,将调用此函数。绑定发生在普通的javascript中,如下所示:
var allTogglingButtons = document.querySelectorAll("[unhideicon],[hideicon]");
crossBrowserAddClickEvent(allTogglingButtons, toggleContent);
crossBrowserAddClickEvent函数是修复另一个IE问题所必需的:
function crossBrowserAddClickEvent(array, functionName)
{
for(var i=0; i < array.length; i++)
{
if (array[i].addEventListener)
{
aray[i].addEventListener('click', functionName);
}
else if (array[i].attachEvent)
{
array[i].attachEvent('onclick', functionName);
}
}
}
这在chrome和火狐中运行得很好,因为" This“变量被设置为我在toggleContent函数中点击的按钮。然而,在IE中,"this“等于(默认的)全局窗口/文档对象,当然,对它调用.parentElement会产生null。为什么“这”不是被点击的按钮?
作为参考,我点击的"button“实际上是一个svg元素:
<svg unhideicon class="svgIcon"> .... </svg>
发布于 2015-07-23 09:12:24
这是一个众所周知的Exlorer问题,您必须使用事件对象来获取调用者
function toggleContent(e)
{
var event = e || window.event;
var parent = (event.target || event.srcElement).parentElement;
toggleClass(parent,"detailsAreVisible");
}
发布于 2015-07-23 09:16:34
实际的问题不是因为IE,而是因为attachEvent
与addEventListener
的不同之处。您应该注意到,您的代码在IE9+中运行良好,因为它将像Chrome和Firefox一样使用addEventListener
。因为IE8使用了attachEvent
,所以需要有一点不同的处理。
我建议你使用call
来调用函数,这样你就可以定义this
是什么,在这种情况下,你可以告诉它是你附加事件的元素:
// other code.
else if (array[i].attachEvent)
{
var element = array[i];
(function (el){
el.attachEvent('onclick', function () {
functionName.call(el);
});
})(element);
}
使用此方法意味着您不必更改toggleContent
函数代码
请注意,我使用了闭包来避免您的循环出现问题。因为单击事件函数会在单击时运行,这意味着它将使用i
的当前值(而不是附加事件时设置的值)。因此,无论您单击哪个元素,i
都将始终等于array.length
。这不仅是错误的号码,而且也是越界的。
https://stackoverflow.com/questions/31582848
复制相似问题