2010-01-04 13 views
34

Die folgende Zeile ist offenbar am besten in Punktnotation geschrieben. Ich versuche, meinen JavaScript-Code zu bereinigen, um ihn zu strikt zu machen. Was heißt das?JavaScript Punktnotation

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

Ich habe einen Kontext zu meiner Codezeile hinzugefügt, falls das hilft? Ich weiß nichts über DOM. Ich versuche nicht, Internet Explorer 4 zu unterstützen, das ist nicht mein Code und ich könnte nicht selbst JavaScript schreiben. Ich versuche nur, um es kompatibel und das JSLint Werkzeug sagt darüber:

Problem in Zeile 17 Zeichen 43: [ ‚dhtmltooltip‘] ist besser geschrieben in Punktnotation.

+1

Sie sollten zuerst nach .getElementById suchen, weil einige Browser fälschen .all für Abwärtskompatibilität; und byId ist die Funktionalität, die Sie wirklich suchen. – Anonymous

+0

Für den Fall, dass jemand sich wundern wird, gibt es keinen Leistungsvorteil der Verwendung von beiden Notation: http://jsperf.com/dot-notation-vs-quare-bracket-notation – Purefan

+0

Wenn Sie nach einem Grund suchen zu verwenden ab statt a ['b'] überprüfe meine [antwort] (http://stackoverflow.com/a/24858166/1090562) –

Antwort

89

Es gibt two ways to access properties of an object in JavaScript.

Dot Notation

foo.bar.baz 

Eckige Klammer Notation

foo['bar']['baz'] 

Sie diese in Teil Ihres Codes verwenden.

Douglas Crockford, der JSLint (ein Werkzeug, das diese Fehlermeldung gibt) geschrieben hat, ist der Meinung, dass es besser ist, Punktnotation zu verwenden, wo es möglich ist.

+0

Danke, das erklärt es! Sie scheinen seine Meinung nicht unbedingt 100% ig für gültig zu halten, gibt es dann einen besseren Weg als JSLint meinen Code zu validieren? – skarama

+2

Ich glaube nicht, dass es eine bessere Möglichkeit gibt, den JS-Code zu validieren, als ihn auszuführen und zu testen. Ich denke, der Punkt, an dem David Dorward versuchte, ist, dass beide gültig sind, und es ist nur eine Frage des Stils.Die Punktnotation ist für die meisten Menschen der am meisten bevorzugte Stil, aber an der Verwendung der eckigen Klammernnotation ist nichts grundsätzlich falsch. – pkaeding

+0

Danke pkaeding. Was war leitete mich JSLint in erster Linie mit dem w3-Validator, der sagte:
Charakter „&“ das erste Zeichen eines Trennzeichens ist aber aufgetreten als Daten
so dachte ich, ich würde, dass die gesamte Skript überprüfen, aber Dieser besondere Fehler ist nicht einmal aufgetaucht ... Ich werde es noch eine Frage machen, wenn ich keinen Weg finde! – skarama

1

Das folgende scheint benutzerfreundlicher zu sein.

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

Vielleicht, aber es verwendet immer noch eckige Klammern Notation, so beantwortet die Frage nicht. – Quentin

+0

Sie können 'document.all [" dhtmltooltip "]' in 'document.all.dhtmltooltip' ändern, wenn Sie möchten. – Li0liQ

+1

Sie können, und das ist der Kern dessen, worum die Frage geht. – Quentin

0

Es ist mit Fähigkeit überprüft ein Element mit dem id dhtmltooltip und fallen zurück auf eine leere String abzurufen, wenn es keine Möglichkeit für das Erledigen der Abruf ist.

UPDATE: Wie andere haben darauf hingewiesen, sollte die Prüfung auf getElementById seine ersten und wahrscheinlich auch weggelassen werden könnte, da jeder Browser, die „modernen“ mit ernstem Gesicht bezeichnen könnte es für eine lange Zeit hat.

UPDATE 2: Mit dem neuen Kontext beschwert sich JSLint, dass es nicht document.all.dhtmltooltip ist. Sie sollten wahrscheinlich nur die ganze Sache neu schreiben als:

und damit erledigt werden.

+1

Was hat das mit der Punktnotation zu tun? – Quentin

+0

Also würde diese Linie meine gesamte Linie ersetzen, sie leichter und aktueller machen, aber immer noch genauso funktionieren? – skarama

+0

Solange Sie IE 4 und andere unglaublich alte Browser nicht unterstützen. –

0

Eine schnelle Google-Suche sagt, dass document.all nur verwendet wird, um IE4 zu unterstützen. Es ist ein Array, das dem Browser den Zugriff auf verschiedene Teile des DOM ermöglicht (siehe here.)

Der Code, den Sie zuerst geschrieben haben, überprüft, ob document.all existiert. Wenn nicht, wird tipobj auf "" gesetzt. Nun, darüber hinaus lohnt es sich nicht wirklich, die Zeile zu entschlüsseln, die Sie gepostet haben, es sei denn Sie wirklich wollen IE4-Unterstützung. Da nur sehr wenige Leute immer noch IE4 verwenden und dieses Stück Code nicht mit allen modernen Standards konform ist, würde ich einfach diese Zeile fallen lassen und tipobj auf "" setzen.

+0

Was hat das mit der Punktnotation zu tun? – Quentin

16

JSLint möchte dies:

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

Aber heutzutage ist ganz sicher davon ausgehen, dass document.getElementById existiert, wurde es auf dem DOM Level Core 2 ab Jahr 2000 eingeführt

document.all tot ist, es sei denn, Sie versuchen, zu unterstützen wirklich alte Browser wie IE4 (12 Jahre alt!):

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

Die beiden obigen Schnipsel sind ein gutes Beispiel ab aus der Komplexität kosten der Unterstützung sehr old browser Versionen:

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

+0

Ersetzt diese Linie meine komplett? – skarama

+0

Ja, außer Sie möchten IE 4 oder älter unterstützen. – CMS

+0

Vielen Dank, mein Herr! – skarama

0

Es sieht aus wie die einzigen wirklichen Probleme sind Formatierung/Syntax. Dies sollte genau so funktionieren und den besten Praktiken von javascript entsprechen. Der Hauptunterschied besteht in der Verwendung der JavaScript-Punktnotation anstelle der Klammernotation.

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

warum nicht einfach verwenden:

var tipobj = dhtmltooltip.id 

nicht sicher, warum die lange Version, es sei denn der Punktnotation funktioniert nicht in allen Browsern erforderlich ist?

0

Wenn die Punktnotation ein Problem darstellt, können Sie immer die Option/* jslint sub: true */setzen, um sie zu überschreiben.

0

Wie wurde von Quentin both ways are valid beantwortet.

Einer der Gründe, warum ich elem.bar anstelle von elem['bar'] bevorzuge ist, dass es 3 Zeichen speichert. Sicherlich ist das keine große Verbesserung, aber eine kostenlose 3 Bit pro Auftrag ist nicht schlecht.

Verwandte Themen