Rolf B: Javascript: replace() funktioniert nicht

Beitrag lesen

Hallo Yadgar,

die gezeigte tag-Funktion tut, was sie mutmaßlich soll: jedes ihrer Argumente in < und > einschließen und das Ergebnis als langen String zurückgeben. Ob eine Funktion sinnvoll ist, sei dahingestellt. Um Stringverarbeitung und den Gebrauch von arguments vorzuführen, kann man sie nehmen.

Du musst allerdings aufpassen. arguments verhält sich unterschiedlich, je nach dem, ob Du im strict mode bist oder nicht. Und eigentlich ist es veraltet (wenn auch nicht missbilligt), man sollte statt dessen einen Restparameter verwenden. Die einzige Existenzberechtigung für arguments ist JavaScript, das auch im Internet Explorer funktionieren soll, denn der kennt keine Restparameter.

Und woher kommen deine Probleme?

Alle 3 Tags sind solche, die geschlossen werden müssen. Wenn Du die Schließ-Gegenstücke nicht sendest (bspw. mit tag("/b", "/span", "/p") - wobei das natürlich auf der Seite Sinn ergeben muss), dann entsteht ein DOM, in dem Elemente offen bleiben.

Speculative Parsing ist - wie Mozilla schreibt, wenn man die Seite findet - ein Feature, um den HTML Parser weiterlaufen zu lassen, während ein Script geladen und ausgeführt wird. Es funktioniert aber nur, wenn in diesem Script das HTML Datenmodell (das DOM) nicht signifikant verändert wird. Signifikant bedeutet: Die Grundstruktur muss erhalten bleiben. HTML Text, der vom Script mit document.write erzeugt wird, darf keinen Einfluss auf den HTML Text nach dem Script haben. Denn andernfalls ist die spekulative Parserei für den Eimer.

Genau das passiert aber, wenn Du HTML Tags öffnest und nicht schließt. Die HTML Elemente, die vom spekulativ verarbeiteten HTML erzeugt wurden, haben dann auf einmal einen anderen Kontext. Und genau das sagt Dir der Browser. Leider ist der Link Müll - ob das an Firefox oder an der Mozilla-Webseite liegt, kann ich Dir nicht sagen, aber der Wenz ist daran nicht Schuld.

Dass ein unbalancierter Baum entsteht, ist ebenfalls nicht die Schuld des Wenz, sondern die Folge deines Gebrauchs der tag-Funktion. Du öffnest Elemente, ohne sie zu schließen. Die Baumstruktur des DOM-Abschnitts, den Du mit document.write schreibst, ist damit nicht im Gleichgewicht. Und der spekulativ erstellte Teil des DOM hinter deinem Script kippt damit um.

Es gibt gute Gründe, weshalb von document.write abgeraten wird. Einen davon hast Du vorgeführt.

Rolf

--
sumpsi - posui - obstruxi