7

Se si tenta questo in Internet Explorer si può vedere che l'evento inviato non riguardano solo durante spumeggiante:Controllare se un evento è identico ad un altro durante l'evento retargeting in più vecchio Internet Explorer

var x; 
myinnerdiv.onclick = function() { x = window.event; }; 
myparentdiv.onclick = function() { alert(x === window.event); }; 
// false, but should be the same! 

Utilizzando l'equivalente su standard metodo basato:

var x; 
myinnerdiv.onclick = function(ev) { x = ev; }; 
myparentdiv.onclick = function(ev) { alert(x === ev); }; 
// true: same event, retargeted 

c'è un modo per identificare in modo univoco un evento in codice per aggirare questa mancanza di funzionalità?

+0

Si tratta di un oggetto, se si desidera estendere, basta fare così: 'ev.mySuperSpecialInfo = 42;'. Ancora meglio, usa il tuo sistema per memorizzare lo stato. 'var eventState = 'reachedParent';' – davin

+0

come ho detto ev.mySuperSpecialInfo non viene inviato in myparentdiv, perché sono due oggetti completamente diversi –

+0

Ho pensato che stiate usando la seconda versione? Altrimenti, dovresti essere tu. – davin

risposta

11

window.event non è un valore di dati ma una funzione getter per creare oggetti evento. Molto come la maggior parte delle proprietà DOM non sono valori di dati ma funzioni accessorie.

Si può anche fare loro uno accanto all'altro:

div.onclick = function() { 
    var a = window.event; 
    var b = window.event; 
    alert(a === b) // false 
}; 

In ogni caso, basta fare la vostra propria funzione:

window.getEvent = (function() { 
    var e = {}; 

    return function() { 
     var cur = window.event; 
     if(cur.type === e.type && 
      cur.srcElement === e.srcElement && 
      cur.clientX === e.clientX && 
      cur.clientY === e.clientY && 
      cur.keyCode === e.keyCode) { 
      return e.evt; 
     } 
     e.type = cur.type; 
     e.srcElement = cur.srcElement; 
     e.clientX = cur.clientX; 
     e.clientY = cur.clientY; 
     e.keyCode = cur.keyCode; 
     e.evt = cur; 
     return cur; 
    }; 
})(); 

myinnerdiv.onclick = function() { 
    var event = getEvent(); 
    event.myCustomProp = 3; 
}; 
myparentdiv.onclick = function() { 
    var event = getEvent(); 
    alert(event.myCustomProp === 3); 
}; 

Si presuppone che questi 5 valori sono sufficienti per vedere se gli oggetti evento rappresentare lo stesso evento, che mi sembra ragionevole.

Test page here, cliccare con precisione il testo 'ASD' (di colore rosso), come l'HTML è:

<div id="myparentdiv"> 
    daa 
    <div id="myinnerdiv">asd</div> 
    daa 
</div> 

Se si desidera qualcosa che funziona di sicuro poi basta usare jQuery, che, fondamentalmente, per creare un intero il modello di evento da zero per farlo in modo più pulito (e utilizzare sempre l'API del modello di evento).

1

Un modo semplice: basta confrontare event1.timeStamp e event2.timeStamp

+1

Questo non sarebbe stato semplice anche se funzionasse in IE6- 8 poiché 2 diversi eventi possono facilmente avere lo stesso timestamp. – Esailija

Problemi correlati