1

我正在尝试在我的一个项目中获得 IE8 支持,并且很难将 addEventListener 转换为 addEvent (来自:http ://ejohn.org/projects/flexible-javascript-events/ )

因此,使用他的代码,我有一个事件设置,例如(来源此处):

_addEvent(eventableIframes[i], 'mousemove', function (e) {
  utilBarHandler(e);
});

但是,当它到达时utilBarHandler,“ e”是null并且 IE8在第 783 行给我一个“需要对象”错误。我假设所需的对象是事件对象,因为当我在函数顶部注销时它实际上e只是null

此外,该循环中需要事件对象的每个事件都会发生这种情况,例如shortcutHandlershortcutUpHandler

更新:以防万一人们错过它,这篇文章有一堆突出显示特定行的链接。

4

2 回答 2

2

并非所有版本的 IE 都将事件作为参数传递。它在window.event。您可以将此添加到您的 _addEvent shim 或事件处理程序中:

 e = e || window.event

如:

_addEvent(eventableIframes[i], 'mousemove', function (e) {
      e = e || window.event;
      utilBarHandler(e);
});

这将适用于 IE 或其他。

这是跨浏览器事件处理的两种风格,可确保在 IE 中正确设置event和指针:this

// add event cross browser
function addEvent(elem, event, fn) {
    if (elem.addEventListener) {
        elem.addEventListener(event, fn, false);
    } else {
        elem.attachEvent("on" + event, function() {
            // set the this pointer same as addEventListener when fn is called
            return(fn.call(elem, window.event));   
        });
    }
}


// refined add event cross browser
function addEvent(elem, event, fn) {
    // avoid memory overhead of new anonymous functions for every event handler that's installed
    // by using local functions
    function listenHandler(e) {
        var ret = fn.apply(this, arguments);
        if (ret === false) {
            e.stopPropagation();
            e.preventDefault();
        }
        return(ret);
    }

    function attachHandler() {
        // set the this pointer same as addEventListener when fn is called
        // and make sure the event is passed to the fn also so that works the same too
        var ret = fn.call(elem, window.event);   
        if (ret === false) {
            window.event.returnValue = false;
            window.event.cancelBubble = true;
        }
        return(ret);
    }

    if (elem.addEventListener) {
        elem.addEventListener(event, listenHandler, false);
    } else {
        elem.attachEvent("on" + event, attachHandler);
    }
}
于 2012-08-12T06:15:05.577 回答
0

@jfriend00 建议的快速而肮脏的修复e = e || window.event方法是 99%,但我仍然遇到问题。经过更多的摆弄,我找到了答案。我不想要window.event,因为它是 iframe。相反,我想要iframeElement.contentWindow. 像这样将它添加到我的回调中就可以了:

_addEvent(eventableIframes[i], 'mousemove', function (e) {
  // self.iframeElement == <iframe>
  e = e || self.iframeElement.contentWindow;
  utilBarHandler(e);
});
于 2012-09-10T08:09:17.973 回答