2010-08-20 117 views
26

让我先指出任何IE用户(这在Chrome,Safari或Firefox中都不是问题)提示提示;)会员未找到IE错误(IE 6,7,8,9)

所以...我有我的IE工具提示一个问题,我对所有它们将成为hoverable,然后在我的鼠标悬停功能我有一个非常基本的跨浏览器的声明,因为这样...

的元素的onmouseover监听器
var event = e || window.event, 
    el = event.target || event.srcElement; 

我一直有问题,窗口对象不存在于IE或东西,这是一个问题后,我添加了一个标志来忽略mouseover的一个元素mouseover在工具提示本身的路上(在允许的时间周期,300ms)。换句话说,该标志将忽略从原始鼠标悬停到工具提示的路线上的鼠标悬停。

这样的逻辑是这样的......

loadtip.refMouseOver = function (e) { 

    var event = e || window.event, el = event.target || event.srcElement; 
    //console.log(window); // <-- throws error in IE (Member not found) 
    // Reset the lastHoveredRef data. 
    tipManager.lastHoveredRef = null; 
    tipManager.lastHoveredRef = [el, event]; 

    // true means there is a tip open still, so if no tip is open. 
    if (tipManager.tipState !== true) { 
     tipManager.processTip(el, event); 
    } else {   
     return; // do nothing 
    } 

} 

“成员未找到”当我从一个元素迅速悬停在IE跟旁边的提示仍处于打开状态会发生错误。

我读到window.open和关闭的东西有尝试捕捉,但我怎么没看到那是relavent。任何帮助是极大的赞赏。

谢谢

回答

42

好的我发现了这个问题。

概括起来,基本上如果该函数调用是的setTimeout内IE不会将事件传递到另一个功能。

所以,你可以通过创建活动的副本,并顺便指出,这里就是一个例子欺骗IE浏览器...

var eventCopy = {}; 
for (var i in event) { 
    eventCopy[i] = event[i];  
} 

然后,只需把你的功能eventCopy,即使这是一个'总'黑客。

setTimeout(function() { yourFunction(eventCopy), yourDelayTime); 

瞧,它会工作。

我要补充,Internet Explorer将只会造成全球窗口事件,这就是为什么我们需要事件的副本的引用。这是因为通过setTimeout的调用该函数的时候,windows.event已过,

底线......不要试图发送一个事件的setTimeout里面,因为IE是不会接受的。对于我测试的IE 6,7 & 8,这是正确的。

0

我意识到这个问题/答案是相当古老,似乎解决了。话虽如此,我还有另外一种替代方案,用于处理与MSIE 9之前的IE版本中的“找不到成员”类似但稍有不同的问题。我希望这能帮助别人解决问题! ......这也可以用来解决Firefox没有的问题window.event

首先我伸出jQuery和附加功能,以获得MSIE版本或-1,如果浏览器不MSIE。你可以做同样的事情,或者只是创建一个纯JS功能来实现这一点。然后创建一个事件覆盖函数(在某些情况下,可能需要添加一个全局的“事件”变量),这更多的是基于个人情况。然后根据需要在事件处理程序中重写事件。

扩展的jQuery

// So this will give you the version of IE (or for non IE browser -1) 
$.fn.msieVersion = function() 
{ 
    if (navigator.userAgent.toLowerCase().indexOf('msie') !== -1) { 
     return document.documentMode; 
    } 
    return -1; 
}; 

覆盖全局事件

var setEvent = function(evt) { 
    // Set the event if MSIE version is >= 9 or is -1 which means it's not IE 
    if ($.fn.msieVersion() >= 9 || $.fn.msieVersion === -1) { 
     // NOTE: I have a global 'event' variable I'm using that comes from another previously loaded JS file 
     // Why? I didn't do it. I'm updating some SUPER old code the best I can. (old enough it has references to Netscape....) 
     event = evt || window.event; 
    } 
    return true; 
}; 

用法示例

$('img.myImageID').bind('mouseover mouseout', function (evt) { 
    setEvent(evt); // Override the event 
    // DO WORK! ...continue all other awesomeness here! 
    // Maybe setTimeout(...) 
};