成员未找到IE错误(IE 6,7,8,9)

yek*_*kta 26 internet-explorer javascript-events

现在让我首先向任何IE用户指出(这不是Chrome,Safari或Firefox中的问题)提示提示;)

所以...我在IE中的工具提示存在问题,我有一个onmouseover监听器,用于所有可以恢复的元素,然后在我的鼠标悬停功能中,我有一个非常基本的跨浏览器声明...

var event = e || window.event,
    el = event.target || event.srcElement;
Run Code Online (Sandbox Code Playgroud)

我一直遇到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
    }

}
Run Code Online (Sandbox Code Playgroud)

当我在工具提示仍然打开的情况下从IE中的一个元素快速悬停到下一个元素时,将发生"未找到成员"错误.

我读了一下window.open并用try catch关闭了东西,但我没看到那是怎么回事.任何帮助是极大的赞赏.

谢谢

yek*_*kta 43

好的,我发现了问题.

总而言之,如果该函数调用在setTimeout内,IE基本上不会将事件传递给另一个函数.

所以你可以通过创建事件的副本并传递它来欺骗IE,这是一个例子......

var eventCopy = {};
for (var i in event) {
    eventCopy[i] = event[i];    
}
Run Code Online (Sandbox Code Playgroud)

然后只需发送你的函数eventCopy,即使这是一个'总'黑客.

setTimeout(function () { yourFunction(eventCopy), yourDelayTime);
Run Code Online (Sandbox Code Playgroud)

瞧它会奏效.

我应该补充一点,Internet Explorer只会创建对全局窗口事件的引用,这就是我们需要事件副本的原因.这是因为在setTimeout调用该函数时,windows.event已经通过,

底线...不要尝试在setTimeout中发送事件,因为IE不会接受它.对于我测试的IE 6,7和8来说,情况确实如此.