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).
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
come ho detto ev.mySuperSpecialInfo non viene inviato in myparentdiv, perché sono due oggetti completamente diversi –
Ho pensato che stiate usando la seconda versione? Altrimenti, dovresti essere tu. – davin