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

时间:2010-08-20 14:21:26

标签: internet-explorer javascript-events

让我首先向任何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关闭了东西,但我没看到那是怎么回事。非常感谢任何帮助。

由于

2 个答案:

答案 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(...)
};