web-dev-qa-db-fra.com

Notation de points JavaScript

La ligne suivante est apparemment mieux écrite en notation à points. J'essaie de nettoyer mon code JavaScript pour le rendre strict. Qu'est-ce que ça veut dire? 

if (ie||ns6)
{
    var tipobj=document.all? document.all["dhtmltooltip"] : document.getElementById? document.getElementById("dhtmltooltip") : "";
}

J'ai ajouté du contexte à ma ligne de code, au cas où cela aiderait? Je ne connais rien à propos de DOM . Je n'essaye pas de supporter Internet Explorer 4, ce n'est pas mon code et je ne pourrais pas écrire JavaScript moi-même. J'essaie seulement de le rendre conforme et l'outil JSLint dit à propos de cette ligne:

Problème à la ligne 17, caractère 43: ['dhtmltooltip'] est mieux écrit en notation à points.

35
skarama

Il y a deux manières d'accéder aux propriétés d'un objet en JavaScript .

Notation par points

foo.bar.baz

Notation entre crochets

foo['bar']['baz']

Vous utilisez ce dernier dans une partie de votre code.

Douglas Crockford, qui a écrit JSLint (un outil qui donne ce message d'erreur), est d'avis qu'il est préférable d'utiliser la notation par points lorsque cela est possible.

92
Quentin

JSLint veut ceci:

var tipobj= document.all ? document.all.dhtmltooltip
                         : document.getElementById 
                           ? document.getElementById("dhtmltooltip") 
                           : "";

Mais, de nos jours, il est tout à fait sûr de supposer que document.getElementById existe, il a été introduit le DOM Level Core 2 à partir de l’an 2000.

document.all est mort, sauf si vous essayez de supporter de très vieux navigateurs comme IE4 (12 ans!):

var tipobj = document.getElementById("dhtmltooltip");

Les deux extraits ci-dessus sont un bon exemple du coût complexité de la prise en charge de très anciens navigateurs versions:

alt text http://ejohn.org/images/cost-benefit.png

16
CMS

Ce qui suit semble être plus convivial.

var tipobj;
if (document.all)
    tipobj = document.all["dhtmltooltip"];
else if (document.getElementById)
    tipobj = document.getElementById("dhtmltooltip");
else
    tipobj = "";
1
Li0liQ

pourquoi ne pas simplement utiliser:

var tipobj = dhtmltooltip.id

Vous ne savez pas pourquoi la version longue est requise sauf si la notation par points ne fonctionne pas dans tous les navigateurs?

0
Michael Sloat

Il semble que les seuls problèmes réels concernent le formatage/la syntaxe. Cela devrait fonctionner exactement de la même manière et être conforme à la meilleure pratique de javascript. La principale différence est l'utilisation de la notation javascript à la place de la notation entre crochets.

if (ie || ns6) {
    var tipobj = document.all ? document.all.dhtmltooltip : document.getElementById ? document.getElementById("dhtmltooltip") : "";
}
0
chills42

Comme cela a été répondu par Quentin les deux voies sont valables .

Une des raisons pour lesquelles je préfère utiliser elem.bar au lieu de elem['bar'] est que cela enregistre 3 caractères. Ce n’est certes pas une grande amélioration, mais 3 piqûres gratuites par affectation n’est pas mauvais.

0
Salvador Dali

Si la notation par points pose problème, vous pouvez toujours définir l'option/* jslint sub: true */pour la remplacer.

0
Tyson Cadenhead

Il utilise la vérification des capacités pour extraire un élément avec l'ID dhtmltooltip et retombe dans une String vide s'il n'y a pas de capacité à effectuer la récupération.

UPDATE: Comme d'autres l'ont souligné, le contrôle de getElementById devrait être le premier, et pourrait probablement être omis, car tout navigateur pouvant être appelé "moderne" à visage droit le possède depuis longtemps.

UPDATE 2 : Avec le nouveau contexte, JSLint se plaint que ce n'est pas document.all.dhtmltooltip. Vous devriez probablement juste réécrire le tout comme:

var tipobj = document.getElementById("dhtmltooltip");

et en finir avec ça.

0
Hank Gay

Une recherche rapide sur Google indique que document.all est uniquement utilisé pour prendre en charge IE4. C'est un tableau qui permet au navigateur d'accéder à différentes parties du DOM (voir ici .)

Le code que vous avez posté en premier vérifie si document.all existe. Sinon, tipobj est défini sur "". Au-delà de cela, il n’est pas utile de déchiffrer la ligne que vous avez postée, à moins que vous souhaitiez réellement supporter IE4. Étant donné que très peu de personnes utilisent encore IE4 et que ce code n'est conforme à aucune norme moderne, il suffit de laisser tomber cette ligne et de définir tipobj à "".

0
avpx