2010-08-16 5 views

Répondre

21

Cela signifie que la evt variable est affectée à la valeur de event ou si event est définie, il est attribué la valeur de window.event. Comment cela fonctionne-t-il? En javascript, les opérateurs booléens n'évaluent pas true ou false mais évaluent plutôt la valeur du dernier objet qui n'est pas falsifié * ou la valeur de la falsification. L'instruction évalue d'abord l'expression event || window.event. Si event est vrai alors l'expression n'a pas besoin d'être évaluée plus loin car un OR n'a besoin que d'un membre pour être vrai. Par conséquent, la valeur event est renvoyée. Si event est falsifié, le côté droit de l'opérateur OR doit être évalué pour déterminer si le résultat est faux. Dans ce cas, si window.event n'est pas falsifié, sa valeur est renvoyée.

Il s'agit d'un idiome très courant pour obtenir l'objet événement à partir des gestionnaires d'événements. Sur les navigateurs conformes aux normes, l'objet événement est transmis en tant que premier paramètre au gestionnaire d'événements. Mais sur IE, l'objet événement est une variable globale. Et pour des raisons historiques, toutes les variables globales sont membres de l'objet window.

Ainsi, le code devrait ressembler à ceci:

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 

    /* ... */ 
} 

Note: * Les valeurs falsy en javascript sont: false, 0, null et non défini.

+0

+1 pour .. «raisons historiques»: deux mots pour définir toute la compatibilité Problèmes, résulter des occurrences de bibliothèque cross-browser (comme '$', 'Prototype', 'YUI' etc.) et pourquoi la vie est alors plus facile et pourquoi la vie est plus compliquée. –

3

Le code est un hack car Microsoft a décidé de placer ses événements dans le global window.event au lieu de le passer en paramètre à la fonction d'événement.

Ainsi, ce code va tenter de mettre evt à l'événement passé dans (qui fonctionnera pour les navigateurs non Microsoft) et, si cela se révèle être null (comme ce sera pour les navigateurs Microsoft), il alors attrapez-le du global. À partir de là, votre fonction peut simplement utiliser evt sans tenir compte des différences de navigateur (enfin, au moins celles relatives aux événements).

2
var evt=event||window.event; 

Le code ci-dessus est un raccourci à une ELSE IF, et est équivalent au code ci-dessous:

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


Deux IF raccourcis AUTRE en 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 
Questions connexes