让我首先向任何 IE 用户指出(这在 Chrome、Safari 或 Firefox 中不是问题)提示提示;)
所以...我在 IE 中的工具提示有问题,我有一个 onmouseover
监听所有要悬停的元素,然后在我的mouseover
中函数我有一个非常基本的跨浏览器声明......
var event = e || window.event,
el = event.target || event.srcElement;
我一直遇到 IE 中不存在的窗口对象或其他东西的问题,这是一个问题,因为我添加了一个标志以忽略从一个元素鼠标悬停到工具提示本身的鼠标悬停(在允许的时间周期内,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 关闭东西,但我不明白这有什么关系。任何帮助是极大的赞赏。
请您参考如下方法:
好的,我发现了问题。
总而言之,如果该函数调用在 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 而言,情况确实如此。