让我首先向任何IE用户指出(这不是Chrome,Safari或Firefox中的问题)提示提示;)
所以...我在IE中的工具提示有问题,我有一个onmouseover监听器,用于所有可以恢复的元素,然后在我的鼠标悬停功能中,我有一个非常基本的跨浏览器声明......
var event = e || window.event,
el = event.target || event.srcElement;
我一直遇到IE浏览器中不存在的窗口对象的问题,这是一个问题,我添加了一个标志来忽略鼠标悬停从一个元素mouseover到工具提示本身的路上(在允许的时间周期内) ,300毫秒)。换句话说,该标志是忽略从原始鼠标悬停到工具提示的路径上的鼠标悬停。
所以逻辑看起来像这样......
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并用try catch关闭了东西,但我没看到那是怎么回事。非常感谢任何帮助。
由于
答案 0 :(得分:43)
好的,我发现了问题。
总结一下,如果该函数调用在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&amp; 8我的测试。
答案 1 :(得分:0)
我意识到这个问题/答案很老,似乎已经解决了。话虽这么说,我还有另一种选择,我已经习惯于处理类似的 - 但略有不同 - 的问题与会员未找到&#39;在MSIE 9之前的IE版本中。我希望这可以帮助某人! ...这也可用于解决Firefox没有 window.event
的问题。
首先,我扩展了jQuery并添加了一个函数来获取MSIE版本,如果浏览器不是MSIE,则添加-1。您可以这样做,或者只是创建一个纯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(...)
};