1

私のプロジェクトで IE8 のサポートを取得しようとしていますが、addEventListener を addEvent に変換するのに苦労しています ( http://ejohn.org/projects/flexible-javascript-events/から) 。

したがって、彼のコードでは、次のようなイベント設定があります ( source here ):

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

ただし、utilBarHandler" e"になると、IE8 は783 行目でnull「オブジェクトが必要です」というエラーを表示します。functionの上部でログアウトすると文字通り null になるため、必要なオブジェクトはイベントオブジェクトであると想定しています。e

shortcutHandlerまた、これは、やなどのイベント オブジェクトを必要とするループ内のすべてのイベントで発生しますshortcutUpHandler

更新: 念のために、この投稿には特定の行を強調するリンクがたくさんあります。

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またはその他のいずれかで動作します。

eventIE でとthisポインターの両方が適切に設定されていることを確認するクロス ブラウザー イベント処理の 2 つのフレーバーを次に示します。

// 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.eventiframeだったので欲しくありませんでした。代わりに私は欲しかっiframeElement.contentWindowた。このようにコールバックに追加すると、うまくいきました:

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