LX: Javascript verbessern

Beitrag lesen

Hallo, JSBETTERER!

Hm okay.. Ich weiß aber 100%ig welche Daten kommen. Also ein | kann nicht kommen, jedenfalls nicht aus dem Ajax-Request.

Dieses 100%ige Wissen basiert auf der unbewußten Unterstellung, dass 1. die Antwort immer von Deinem Server kommt, 2. dieser nicht gehackt werden kann, 3. auch ein Man-in-the-middle-Angriff nicht möglich ist und 4. dem Client auch nicht beispielsweise durch Cross-Site-Scripting andere Inhalte untergeschoben werden können.

Du musst natürlich nicht JSON verwenden, es hätte nur den Vorteil, dass es inzwischen bei allen modernen Browsern standardmäßig einen eingebauten Parser gibt, der enorm schnell ist - fast so schnell wie "split" - mit dem zusätzlichen Vorteil, dass Dein Code lesbarer wird.

Ich soltle vllt. erwähnen das dieses Skript alle 300ms aufgerufen wird vom Clienten.

Das bedeutet, dass Du ca. 3,25 Mal pro Sekunde das Script aufrufst. Da Dir offenbar nicht klar ist, dass ein asynchroner Request mehr als 3s dauern kann, kommt also noch das Problem hinzu, dass Du Timeout-Probleme nicht berücksichtigt hast: wenn auf diese Weise immer mehr Requests auflaufen, wird die Seite irgendwann nicht mehr funktionieren.

Einerseits solltest Du überlegen, ob Du wirklich diese Netzlast generieren und Deinen Server damit belasten möchtest. Andererseits solltest Du die möglichen Timeout-Probleme, die sich daraus ergeben, unbedingt abfangen, d.h. wenn ein Request offen ist, sollte kein weiterer geöffnet werden oder aber der vorherige Request abgebrochen werden.

// gather data in object "data"
var fields = {
   'auctionprice': function() { return (data.price || '?').replace(/<.*?>/,''); },
   'auctionprice2': ...
}, field;
for (field in fields) {
   if (!fields.hasOwnProperty(field)) { continue; }
   (document.getElementById(field) || {}).innerHTML = fieldsfield;
}

Ist das schneller? Sicherer?

Nicht schneller, aber übersichtlicher und schneller zu ergänzen, falls Du Deinen Code einmal erweitern möchtest. Was hier passiert, ist: die Funktionen, die den Wert zurückgeben, der in einem Node stehen sollen, werden in ein Objekt gepackt, dabei hat jede Funktion den Namen der ID des Felds. Dann wird über dieses Objekt iteriert (also einmal alle Eigenschaften des Objekts durchgegangen) und das jeweilige Feld entsprechend befüllt.

Was, wenn ein Feld gelöscht wurde?

Meinst du wenn ein Node nicht mehr da Ist?

Genau. Dann führt der Versuch, in document.getElementById('name').innerHTML zu schreiben, zwangsläufig zu einem Fehler - der sich durch eine Abfrage oder noch einfacher dem folgenden Konstrukt abfangen läßt:

(document.getElementById(feldname) || {}).innerHTML = ...

Wenn das Feld nicht gefunden werden kann, landen die Daten schadlos in einem anonymen Objekt und es wird kein Fehler geworfen. Alternativ kannst Du natürlich auch ein benanntes Objekt nehmen und nachträglich prüfen, ob die innerHTML-Eigenschaft befüllt wurde und dann den Fehler selbst behandeln.

Gruß, LX

--
RFC 1925, Satz 2: Egal, wie fest man schiebt, ganz gleich, wie hoch die Priorität ist, man kann die Lichtgeschwindigkeit nicht erhöhen.