2010-01-04 11 views
34

La ligne suivante est apparemment écrite au mieux en notation point. J'essaie de nettoyer mon code JavaScript pour le rendre strict. Qu'est-ce que ça veut dire? J'ai ajouté un peu de contexte à ma ligne de code, au cas où cela aiderait? Je ne sais rien sur DOM. Je n'essaie pas de supporter Internet Explorer 4, ce n'est pas mon code et je ne serais pas capable d'écrire moi-même JavaScript. Je n'essaie de l'obtenir conforme et l'outil JSLint dit à ce sujet:Notation par points JavaScript

problème à la ligne 17 caractère 43: [ « dhtmltooltip »] est mieux écrit en notation par points.

+1

Vous devriez d'abord tester .getElementById, car certains navigateurs falsifient .all pour la rétrocompatibilité; et byId est la fonctionnalité que vous recherchez vraiment. – Anonymous

+0

Dans le cas où quelqu'un se demande, il ne semble y avoir aucun avantage de performance de l'utilisation de l'une ou l'autre notation: http://jsperf.com/dot-notation-vs-square-bracket-notation – Purefan

+0

Si vous cherchez une raison d'utiliser ab au lieu d'un ['b'] vérifier ma [réponse] (http://stackoverflow.com/a/24858166/1090562) –

Répondre

89

Il existe two ways to access properties of an object in JavaScript.

notation Dot

foo.bar.baz 

notation CROCHET

foo['bar']['baz'] 

Vous utilisez cette dernière 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.

+0

Merci, ça l'explique! Vous semblez considérer son opinion pas forcément 100% valide, y at-il un meilleur moyen que JSLint de valider mon code? – skarama

+2

Je ne pense pas qu'il existe une meilleure façon de valider le code JS, autre que de l'exécuter et de le tester. Je pense que le point que David Dorward essayait de faire, c'est que les deux sont valides, et c'est juste une question de style.La notation par points est le style le plus préféré, par la plupart des gens, mais il n'y a rien de foncièrement mauvais dans l'utilisation de la notation à crochets. – pkaeding

+0

Merci pkaeding. Ce qui me conduire à l'utilisation JSLint en premier lieu était le validateur w3 qui disait:
caractère « & » est le premier caractère d'un delimiter mais se sont produits sous forme de données
donc je me suis dit que je vérifierais ce script entier, mais cette erreur particulière n'est même pas venue .. Je vais en faire une autre question si je ne trouve pas un moyen! – skarama

1

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

Peut-être, mais il utilise encore la notation en carré, donc ne répond pas à la question. – Quentin

+0

Vous pouvez remplacer 'document.all [" dhtmltooltip "]' par 'document.all.dhtmltooltip' si vous le souhaitez. – Li0liQ

+1

Vous pouvez, et c'est le cœur de la question. – Quentin

0

Il utilise la capacité de vérification pour récupérer un élément avec l'id dhtmltooltip et retombant à un String vide s'il n'y a pas une capacité de faire la récupération.

MISE À JOUR: Comme d'autres l'ont souligné, le chèque de getElementById devrait être le premier, et pourrait probablement être omis puisque tout navigateur qui pourrait être appelé « moderne » avec un visage impassible a eu pendant longtemps.

MISE À JOUR 2: Avec le nouveau contexte, JSLint se plaint qu'il n'est pas document.all.dhtmltooltip. Vous devriez probablement juste réécrire le tout comme:

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

et être fait avec.

+1

Qu'est-ce que cela a à voir avec l'utilisation de la notation par points? – Quentin

+0

Donc cette ligne remplacerait toute ma ligne, la rendrait plus légère et plus courante mais fonctionnerait toujours de la même manière? – skarama

+0

Tant que vous ne vous souciez pas de soutenir IE 4 et d'autres navigateurs incroyablement anciens. –

0

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

Le code que vous avez publié vérifie d'abord si document.all existe. Sinon, il définit tipobj à "". Maintenant, au-delà de ça, ça ne vaut pas vraiment la peine de déchiffrer la ligne que vous avez publiée, à moins que vous n'ayez vraiment besoin du support IE4. Étant donné que très peu de personnes utilisent encore IE4 et que ce morceau de code n'est conforme à aucune norme moderne, je laisserais tomber cette ligne et réglerais tipobj à "".

+0

Qu'est-ce que cela a à voir avec l'utilisation de la notation par points? – Quentin

16

JSLint veut que ce soit:

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

Mais de nos jours est tout à fait raisonnable de supposer que document.getElementById existe, il a été introduit sur le DOM Level Core 2 dès l'an 2000.

document.all est mort, à moins que vous essayez de soutenir vraiment vieux navigateurs comme IE4 (12 ans!!):

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

Les deux extraits ci-dessus sont un bon exemple ab le coût de la complexité de soutien très old browser versions:

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

+0

Cette ligne remplace-t-elle entièrement la mienne? – skarama

+0

Oui, à moins que vous ne souhaitiez prendre en charge IE 4 ou une version antérieure. – CMS

+0

Merci monsieur monsieur! – skarama

0

Il semble que les seuls vrais problèmes sont la mise en forme/syntaxe. Cela devrait fonctionner exactement de la même manière et se conformer aux meilleures pratiques de javascript. La différence principale est l'utilisation de la notation par points javascript au lieu de la notation de parenthèse.

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

pourquoi ne pas simplement utiliser:

var tipobj = dhtmltooltip.id 

Je ne sais pas pourquoi la version longue est nécessaire à moins que la notation des points ne fonctionne pas dans tous les navigateurs?

0

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

0

Comme il a été répondu par Quentin both ways are valid.

Une des raisons pour lesquelles je préfère utiliser elem.bar au lieu de elem['bar'] est qu'il enregistre 3 caractères. Certes, ce n'est pas une grande amélioration, mais un 3 points gratuits par affectation n'est pas mauvais.

Questions connexes