2010-08-16 14 views

risposta

21

significa che la variabile evt è assegnato al valore di event o se event è indefinito esso viene assegnato il valore di window.event.

Come funziona è che in javascript, gli operatori booleani non valutano true o false ma invece valutano il valore dell'ultimo oggetto che non è falsy * o il valore di falsy.

Quindi la dichiarazione valuta prima l'espressione event || window.event. Se event è true, non è necessario valutare ulteriormente l'espressione poiché un OR richiede solo un membro per essere vero. Pertanto viene restituito il valore di event. Se event è falso, è necessario valutare il lato destro dell'operatore OR per determinare se il risultato è falso. In tal caso, se window.event non è falsy, viene restituito il suo valore.

Questo è un idioma molto comune per ottenere l'oggetto evento dai gestori di eventi. Sui browser conformi agli standard, l'oggetto evento viene passato come primo parametro al gestore eventi. Ma su IE l'oggetto evento è una variabile globale. E per ragioni storiche, tutte le variabili globali sono membri dell'oggetto window.

Così il codice dovrebbe essere qualcosa di simile:

element.onclick = function (event) { 
    var evt = event ||  // use the value of event if available or 
      window.event;// if not assume it's IE and use window.event 

    /* ... */ 
} 

Nota: i valori * falsy in javascript sono: false, 0, null e indefinito.

+0

+1 per ... 'ragioni storiche': due parole per definire tutta la compatibilità problemi, resuls occorrenze di librerie cross-browser (come '$', 'Prototype', 'YUI' ecc.) e perché la vita è allora più facile e perché la vita è più complicata. –

3

Il codice è un hack perché Microsoft ha deciso di inserire i propri eventi nello window.event globale anziché passarlo come parametro alla funzione evento.

Quindi, questo codice tenterà di impostare evt all'evento passata (che lavorerà per i browser non Microsoft) e, se questo risulta essere null (come sarà per i browser di Microsoft), lo farà quindi prendilo dal globale.

Da quel momento in poi, la funzione può semplicemente utilizzare evt ignorando le differenze tra browser (beh, almeno quelle relative agli eventi).

2
var evt=event||window.event; 

Il codice di cui sopra è una scorciatoia per un ELSE IF, ed è equivalente al codice sotto:

var evt = "nothing valuable yet"; 
if (event) { 
    evt = event; 
} else { 
    evt = window.event; 
} 


due se scorciatoie ELSE in Javascript:

var resultIsTrue = true || false; // if first value is true, return first value 
var resultIsFalse = true && false; // if first value is true, return second value