2

何らかの目的で、Window.Eventオブジェクトを変数にキャッシュして後で使用したいのですが、MSIEはこれが「不明」であると言い続けます。

以下のコードをIEで実行するだけで、意味がわかります

どうすればこれが起こるのでしょうか?私は何か見落としてますか?

html:

<button id='btn'>Click!!!</button>

JS:

    var eventObj = null;
    document.getElementById('btn').onclick = function() {
       eventObj = window.event;
       setTimeout(function() {
          alert(typeof eventObj.srcElement);
       }, 1000)
    }​

EIDT 1:

私は他の人によって行われたいくつかのテストを検索しました、以下を参照してください:

HTML:

<button id='btn1'>Click 1 !!</button>
<button id="btn2">Click 2 !!</button>

JS

var btn1EventObj = null;
document.getElementById('btn1').onclick = function() {
    btn1EventObj = window.event;
    alert(btn1EventObj.srcElement.id);
}
document.getElementById('btn2').onclick = function() {
    alert(btn1EventObj === window.event); // output:false;
    alert(btn1EventObj.srcElement === window.event.srcElement); // output: true ; 
    alert(btn1EventObj.srcElement.id); // output: btn2 ;
}

btn1がクリックされたら、「イベントオブジェクト」をbtn1EventObjにキャッシュし、btn2をクリックすると仮定します。

テスト:

btn1EventObj === window.event-> false; //MSIEにはイベントオブジェクトが1つだけではありません

btn1EventObj.srcElement === window.event.srcElement->true //以下のこれを理解できません。

btn1EventObj.srcElement.id-> btn2

フィドルを参照してください

したがって、上記のすべては、MSIEで発生したすべてのイベントがすべて共有属性であり、btn2がクリックされると、前のすべての属性が後の属性によって上書きされることを示しています。

私はちょっと正しいですか?

4

3 に答える 3

1

`window.event'はグローバルオブジェクトであり、発生したイベントごとに変更される可能性があります。ミリ秒以内にブラウザで発生する多くのイベント。

ノート:

オブジェクトが変数にvar y = someObjectコピーされていないことを設定した場合、変数にはメモリ内のオブジェクトのアドレスが含まれているだけです(オブジェクト参照とポインタについてグーグルで検索できます)。したがって、オブジェクトをにコピーするか、以下の代替ソリューションを試す必要があります。yyy

function(e){}したがって、スタイルイベントハンドラーを使用する必要があります。

var eventObj = null; 
document.getElementById('btn').onclick = function(e) { 
   eventObj = e;
   setTimeout(function() { 
      alert(typeof eventObj.srcElement); 
   }, 1000) 
} 

jsfiddleでこれを参照してください

編集1:

M $ IEでは、次のコードを使用できます。

function copyObject(o){
    return {srcElement: o.srcElement,
           ...
           more attributes ...
            };
}

var eventObj = null; 
document.getElementById('btn').onclick = function(e) { 
   eventObj = copyObject(window.event);
   setTimeout(function() { 
      alert(typeof eventObj.srcElement); 
   }, 1000) 
} 

jsfiddle(編集済み)を参照してください

于 2012-07-14T09:52:24.427 に答える
1

window.eventIEの実際のイベントのコンテキストからコピーすることはできません。つまり、スクリプトでハンドラーを割り当てるときに、既存のイベントはありません。を参照する場合はwindow.event、ハンドラーをインラインで割り当てる必要があります。

MSDN:

The event object is available only during an event—that is,
you can use it in event handlers but not in other code.

HTML:

<button id='btn' onclick="clicker(event);">Click!!!</button>

およびJS:

function clicker(e){
    setTimeout(function (){
        alert(e.srcElement);
    },1000);
    return;
}

eventMSDNで。

于 2012-07-14T10:12:26.910 に答える
0
var eventObj = null;
document.getElementById('btn').onclick = function() {
   eventObj = window.event;
   setTimeout((function(eventObj) {
      alert(typeof eventObj.srcElement);
   })(eventObj), 1000)
}

デモ。

イベントオブジェクトは、イベント中にのみ使用できます。つまり、イベントハンドラーでは使用できますが、他のコードでは使用できません。setTimeoutまた、使用しているため、競合を回避するために、イベントの実行後には使用できません。IEはそれをnullに設定します。 1秒は利用できないので、クロージャーを使用できます。

于 2012-07-14T10:40:21.333 に答える