6

quirksmode.org で関連する記事のほとんどを読みましたが、これについてはまだよくわかりません:

アプリを IE8 と互換性を持たせる (fun fun fun) onclick イベントをリンクに設定しようとすると、この問題が発生します。

function myClickHandler(event)
{
    alert(event);
}

var link = document.getElementById("myLink");
link.onclick = myClickHandler; //first option

とは対照的に:

function myClickHandler(event)
{
    alert(event);
}

var link = document.getElementById("myLink");
link.onclick = function() {
   myClickHandler(event); //second option
}

最初のオプション myClickHandler alerts を使用しますundefined。2 番目のオプション アラート[object Event]を使用すると、イベント オブジェクトが最初のオプションによってハンドラーに渡されていないと思われます。なぜこれはIE8でそうなのですか?

注:実行中に単一のリスナーをオーバーライドしたいので、 attachEvent を使用したくないので、onclickここにうまく収まるようです。

4

2 に答える 2

11

window.eventはい、IE <= 8 では、イベント オブジェクトはパラメータとして DOM0 スタイルのイベント ハンドラに渡されません。代わりに から取得する必要があります。というパラメータを追加するとevent、IE <= 8 ではこれになり、イベント ハンドラ内のundefinedへの参照eventは ではなく未定義のパラメータに解決されますwindow.event。私は通常window.event、コードでこれを明示するために使用します。

link.onclick = function(evt) {
   evt = evt || window.event;
}
于 2013-08-19T08:46:59.610 に答える
0

ウィンドウでクリックイベントを処理しtarget、IE8 でプロパティを操作する必要があった
場合、私のプロジェクトで使用したソリューション:

 document.onclick = function(event) {
                event = event || fixEvent.call(this, window.event);
                var target = event.target || event.srcElement;
                var className = target.className;
                // ....
            };




//For IE8 
// source: https://learn.javascript.ru/fixevent
    function fixEvent(e) {

       e.currentTarget = this;
       e.target = e.srcElement;

       if (e.type == 'mouseover' || e.type == 'mouseenter') e.relatedTarget = e.fromElement;
       if (e.type == 'mouseout' || e.type == 'mouseleave') e.relatedTarget = e.toElement;

       if (e.pageX == null && e.clientX != null) {
           var html = document.documentElement;
           var body = document.body;

           e.pageX = e.clientX + (html.scrollLeft || body && body.scrollLeft || 0);
           e.pageX -= html.clientLeft || 0;

           e.pageY = e.clientY + (html.scrollTop || body && body.scrollTop || 0);
           e.pageY -= html.clientTop || 0;
       }

       if (!e.which && e.button) {
           e.which = e.button & 1 ? 1 : (e.button & 2 ? 3 : (e.button & 4 ? 2 : 0));
       }

       return e;
   }
于 2016-04-26T15:19:25.810 に答える