Ich kenne document.write gilt als schlechte Praxis; und ich hoffe, eine Liste mit Gründen zusammenstellen zu können, die einem Drittanbieter vorgelegt werden sollten, warum sie es nicht verwenden sollten document.write in Implementierungen ihres Analysecodes.
Bitte geben Sie Ihren Anspruchsgrund an document.write als schlechte Praxis unten.
Annakata
Einige der schwerwiegenderen Probleme:
document.write (im Folgenden DW) funktioniert nicht in XHTML
DW ändert das DOM nicht direkt, wodurch weitere Manipulationen verhindert werden(Versuch, Beweise dafür zu finden, aber es ist bestenfalls situativ)
DW, das ausgeführt wird, nachdem die Seite vollständig geladen wurde, überschreibt die Seite oder schreibt eine neue Seite oder funktioniert nicht
DW wird dort ausgeführt, wo es angetroffen wird: Es kann nicht an einem bestimmten Knotenpunkt injiziert werden
DW schreibt effektiv serialisierten Text, was nicht der Art und Weise entspricht, wie das DOM konzeptionell funktioniert, und es ist eine einfache Möglichkeit, Fehler zu erstellen (.innerHTML hat das gleiche Problem).
-1, es modifiziert das DOM absolut. Alles andere ist in Ordnung. Während ich den Drang verstehe, mich auf Strukturen und Methoden zu verlassen, die Sie vor Schaden bewahren können, könnte dies ein Fall sein, in dem Sie das Baby mit dem Bade ausschütten.
– vgl
29. April 2009 um 15:50 Uhr
FireBug ist keine echte Repräsentation des DOM. Es ist der Versuch von Mozilla, HTML in ein DOM zu parsen. In der Firebug-DOM-Ansicht können Sie völlig kaputtes HTML richtig aussehen lassen.
– FlySwat
29. April 2009 um 16:17 Uhr
Das DOM ist die Datenstruktur, die zum Rendern der Seite verwendet wird, und als solche das A und O dessen, was der Benutzer auf der Seite sieht. Sie haben Recht, dass HTML != DOM ist, aber es ist unerheblich für die Frage, ob das DOM von DW geändert wird oder NICHT. Wenn DW das DOM nicht geändert hat, sehen Sie den Bildschirm nicht – das gilt für alle Browser und wird es immer sein, solange das DOM zum Rendern der Seite verwendet wird.
– vgl
29. April 2009 um 16:41 Uhr
“DW wird dort ausgeführt, wo es gefunden wurde” – nicht immer ein Nachteil, es könnte sogar für bestimmte Dinge als Vorteil angesehen werden, zB das Hinzufügen von Skriptelementen (eigentlich das Einzige, wofür ich DW verwenden würde, und selbst dann würde ich es mir zweimal überlegen).
– nnnnn
25. Dezember 2011 um 12:16 Uhr
@RicardoRivaldo Ja, das tun sie, wenn document.write wird aufgerufen, nachdem das Dokument vollständig geladen wurde
– Iskata
19. September 2013 um 2:37 Uhr
Peter Bailey
Daran ist eigentlich nichts auszusetzen document.write, an sich. Das Problem ist, dass es sehr einfach ist, es zu missbrauchen. Grob sogar.
Für Anbieter, die Analysecode bereitstellen (wie Google Analytics), ist dies tatsächlich der einfachste Weg, solche Snippets zu verteilen
Es hält die Skripte klein
Sie müssen sich keine Gedanken darüber machen, bereits etablierte Onload-Ereignisse zu überschreiben oder die notwendige Abstraktion einzubeziehen, um Onload-Ereignisse sicher hinzuzufügen
Es ist extrem kompatibel
Solange Sie nicht versuchen, es zu verwenden, nachdem das Dokument geladen wurde, document.write ist meiner bescheidenen Meinung nach nicht von Natur aus böse.
document.write macht wirklich schreckliche Dinge mit den HTML-Parsern und ist nur in einfachen Fällen “extrem kompatibel”.
– Oliej
29. April 2009 um 19:24 Uhr
Wie das Einfügen eines Analytics-Tags? Das ist schließlich ein Teil der ursprünglichen Frage. Und mit extrem kompatibel meine ich nur eine reine Browserunterstützung für die document.write-Methode.
– Peter Bailey
29. April 2009 um 19:28 Uhr
Alles, was mit den neuesten Versionen von Chrome / IE / Safari / Opera / FireFox funktioniert, gilt als kompatibel.
– Schrittmacher
12. Oktober 2014 um 8:22 Uhr
Onload-Ereignisse überschreiben? Und was … ist addEventListener zum?
– m93a
13. Februar 2015 um 19:48 Uhr
Chrome wird nicht ausgeführt document.write Aufrufe, die ein Skript einfügen, wenn bestimmte Bedingungen erfüllt sind.
– Flimmer
12. Juli 2017 um 15:21 Uhr
Sean McMillan
Es kann Ihre Seite blockieren
document.write funktioniert nur, während die Seite geladen wird; Wenn Sie es aufrufen, nachdem die Seite geladen wurde, wird die gesamte Seite überschrieben.
Dies bedeutet effektiv, dass Sie es von einem Inline-Skriptblock aufrufen müssen – und das verhindert, dass der Browser Teile der folgenden Seite verarbeitet. Skripte und Bilder werden erst heruntergeladen, wenn der Schreibblock abgeschlossen ist.
Kevin Hakanson
Eine weitere legitime Verwendung von document.write stammt aus dem HTML5 Boilerplate index.html Beispiel.
<!-- Grab Google CDN's jQuery, with a protocol relative URL; fall back to local if offline -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/libs/jquery-1.6.3.min.js"><\/script>')</script>
Dies ist der einfachste Weg, um Inline-Inhalte aus einem externen Skript (zu Ihrem Host/Ihrer Domäne) einzubetten.
Sie können den gesamten Inhalt in einem Frame/Iframe überschreiben. Ich habe diese Technik oft für Menü-/Navigationsstücke verwendet, bevor modernere Ajax-Techniken weit verbreitet waren (1998-2002).
Nachteil:
Es serialisiert die Rendering-Engine so, dass sie anhält, bis das externe Skript geladen ist, was viel länger dauern könnte als ein internes Skript.
Es wird normalerweise so verwendet, dass das Skript innerhalb des Inhalts platziert wird, was als schlechte Form angesehen wird.
Es gibt noch mehr Nachteile. Beispielsweise weigert sich Google Chrome, ausgeführt zu werden document.write das schafft <script> Tag unter bestimmten Umständen. developer.google.com/web/updates/2016/08/…
– Flimmer
12. Juli 2017 um 15:14 Uhr
@Flimm, es ist erwähnenswert, Ihr Kommentar ist über 8 Jahre nach meiner Antwort und dies fast 3 Jahre später. Ja, es gibt andere Nachteile … und ich wäre überrascht, wenn document.write selbst nicht verschwindet … sowie möglicherweise einige andere stark missbrauchte Schnittstellen.
– Verfolger1
16. April 2020 um 1:32 Uhr
Ry-
Hier ist mein Zwei-Pence-Wert, den Sie im Allgemeinen nicht verwenden sollten document.write für schweres Heben, aber es gibt einen Fall, in dem es definitiv nützlich ist:
Ich habe dies kürzlich entdeckt, als ich versuchte, eine AJAX-Slider-Galerie zu erstellen. Ich habe zwei verschachtelte Divs erstellt und angewendet width/height und overflow: hidden nach außen <div> mit JS. Dies war so, dass für den Fall, dass der Browser JS deaktiviert hatte, das div schweben würde, um die Bilder in der Galerie aufzunehmen – eine nette, anmutige Verschlechterung.
Die Sache ist, wie beim obigen Artikel, dass diese JS-Hijacking des CSS nicht einsetzte, bis die Seite geladen war, was einen kurzen Blitz verursachte, als das div geladen wurde. Also musste ich beim Laden der Seite eine CSS-Regel schreiben oder ein Blatt einfügen.
Offensichtlich funktioniert dies nicht in XHTML, aber da XHTML so etwas wie eine tote Ente zu sein scheint (und als Tag-Suppe im IE gerendert wird), könnte es sich lohnen, Ihre Wahl von DOCTYPE neu zu bewerten …
Es gibt noch mehr Nachteile. Beispielsweise weigert sich Google Chrome, ausgeführt zu werden document.write das schafft <script> Tag unter bestimmten Umständen. developer.google.com/web/updates/2016/08/…
– Flimmer
12. Juli 2017 um 15:14 Uhr
@Flimm, es ist erwähnenswert, Ihr Kommentar ist über 8 Jahre nach meiner Antwort und dies fast 3 Jahre später. Ja, es gibt andere Nachteile … und ich wäre überrascht, wenn document.write selbst nicht verschwindet … sowie möglicherweise einige andere stark missbrauchte Schnittstellen.
– Verfolger1
16. April 2020 um 1:32 Uhr
Alemb
Es überschreibt Inhalte auf der Seite, was der offensichtlichste Grund ist, aber ich würde es nicht als “schlecht” bezeichnen.
Es hat einfach nicht viel Nutzen, es sei denn, Sie erstellen ein ganzes Dokument mit JavaScript. In diesem Fall können Sie mit document.write beginnen.
Trotzdem nutzen Sie das DOM nicht wirklich, wenn Sie document.write verwenden – Sie werfen nur einen Textklumpen in das Dokument, also würde ich sagen, dass es eine schlechte Form ist.
Eine Klarstellung: document.write fügt Inhalte auf der Seite ein, überschreibt sie nicht.
– Peter Dolberg
29. April 2009 um 15:45 Uhr
@Peter, es überschreibt den Inhalt, wenn Sie es aufrufen, nachdem das Dokument geladen wurde. Ich vermute, das ist es, was aleemb bedeutet.
– Matthew Crumley
29. April 2009 um 17:09 Uhr
Schlagen Sie vor, dass man stattdessen die einzelnen DOM-Knoten manuell im Code erstellen sollte, anstatt nur so etwas zu tun? div.innerHTML = "<label for='MySelect'>Choose One</label><select id='MySelect'><option value='foo' selected=''>foo</option><option value='bar'>bar</option></select>";? Das scheint, als würde es viel unnötigen und weniger lesbaren Code produzieren. Es ist auch das genaue Gegenteil von dem Ansatz, den John Resig und andere JS-Entwickler vertreten.
– Lèse Majesté
26. Dezember 2012 um 8:25 Uhr
9858300cookie-checkWarum gilt document.write als „schlechte Praxis“?yes