查找不到成员 IE 错误(IE 6、7、8、9)

26

首先要提醒任何正在使用IE的用户(在Chrome、Safari或Firefox中不会出现此问题)- 小提示 ;)

那么...我在IE中遇到了有关工具提示的问题,我为所有可悬停元素添加了一个onmouseover监听器,然后在我的mouseover函数中,我有一个非常基本的跨浏览器声明,如下所示...

var event = e || window.event,
    el = event.target || event.srcElement;

我一直遇到 window 对象在 IE 中不存在的问题,这是我在添加一个标志以忽略从一个元素的 mouseover 到工具提示本身(在允许的时间循环内,300ms)时出现的问题。换句话说,该标志是为了忽略从原始 mouseover 到工具提示的路线上的鼠标悬停事件。

因此,该逻辑如下所示...

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中快速从一个元素悬停到另一个元素时,如果工具提示仍然打开,则会出现“未找到成员”错误。

我阅读了关于使用try catch和 window.open的文章,但我不知道它们如何相关。非常感谢任何帮助。

2个回答

43

好的,我已经找到了问题。

总结一下,基本上如果在setTimeout中调用另一个函数,IE将不会将事件传递给该函数。

因此,您可以通过创建事件的副本并传递该副本来欺骗IE。以下是一个示例...

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

只需将eventCopy发送到您的函数中,即使这是一个“hack”。

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函数即可完成此操作。然后创建一个事件覆盖函数(在某些情况下可能需要添加全局“event”变量),这更多是基于每个单独情况的基础。然后根据需要在事件处理程序中覆盖事件。

扩展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(...)
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接