2010-09-01 7 views
13

Ich arbeite für eine Firma, die Software schreibt, die Client-Sites mit < script language = "JavaScript" src = ..... etc. usw. Wir hängen ziemlich ein bisschen auf document.write um Elemente auf die Seite zu schreiben. Einer unserer Kunden hat sich aus irgendeinem Grund dafür entschieden, den Inhaltstyp "application/xhtml + xml" zu verwenden, was document.write() in Chrome unbrauchbar macht.Ersetzen von document.write() s in einer xhtml + xml Seite

Ich verstehe, warum dies ist, und dass DOM-konformen Code jedes Element erstellen, seine Attribute festlegen, füllen Sie es bei Bedarf mit einem Textknoten, hängen Sie den Textknoten an seine Eltern und das übergeordnete Element an einige Seitenelement .. ..

aber was ist eine gute Problemumgehung, die nicht all diesen Kram erfordert? Die write() s darin haben so viele Elemente, dass der resultierende Code hässlich wäre, wenn wir Knoten machen und sie zusammenfügen würden wie Knex oder Legos oder was-du-hättest.

edit: Versuchte CDATA verwenden, aber auch diese Linie verurteilt wird in ähnlicher Weise durch den xhtml-Parser auf der gleichen Seite wie unsere Skript einbetten:

<script language="text/javascript"><![CDATA[document.write('hi');]]></script> 
+1

Auf den ersten Blick sieht JSONML - http://jsonml.org/ - so aus, als würde es tun, was Sie wollen, aber seit ich es nur gegoogelt habe und nicht lange gesucht habe, bin ich es nicht zuversichtlich genug, um dies eine Antwort zu nennen. – Quentin

Antwort

10
var el = document.createElement('div'); 
el.innerHTML = 'What you used to document.write()'; 
document.body.appendChild(el); 

Beachten Sie, dass Sie benötigen, um den HTML-Code zu beheben um gültiges XHTML zu sein, aber das sollte viel weniger Arbeit als das Umwandeln des gesamten Codes sein, um DOM-Manipulation zu verwenden.

+0

innerHTML funktioniert nicht in XML –

+0

Es tut es die HTML ist gültig XHTML. Der obige Code wurde aus dem Produktionscode erstellt, und Sie werden feststellen, dass jQuery eine ähnliche Technik zum Erstellen von Fragmenten verwendet. Testseite: http://pastebin.com/4akXVkv3 – stormsweeper

+0

Okay, sieht aus wie es für alle modernen Browser implementiert ist und ist Teil von HTML5. Ich würde Ihre Antwort auf den Kopf stellen, aber ich bin gesperrt, wenn Sie es nicht bearbeiten. –

0

Wir haben Jquery verwendet und Timeouts gesetzt, um den von ähnlichen Organisationen für Sie bereitgestellten Code neu zu schreiben. Hier ist ein Beispiel von Such Ignite:

<script> 
<!-- 
// once all the page has loaded 
$(document).ready(function() 
    { 
     // wait a bit so everything else that runs when the page has loaded loads, then... 
     setTimeout(function() 
     { 
      // ...load the tracking stuff 
      var headerTag = document.getElementsByTagName('head')[0]; 
      var seo_tag = $.createElement(document.location.protocol + "//track.searchignite.com/si/CM/Tracking/ClickTracking.aspx?siclientid=123456&jscript=1", "script"); 
      headerTag.appendChild(seo_tag); 

     }, 20); 
    }); 
// --> 
</script> 

Das Timeout hat den zusätzlichen Vorteil auf unserer Seite, die auf den Benutzer vor dem dem externen Code zu machen durch den Benutzer-Browser geladen worden ist, sehr nützlich, wenn die externen Lieferanten Server jemals gehen Nieder. Ja, wir verlieren einige Tracking-Statistiken, aber die Benutzererfahrung ist nicht gefährdet.

Offensichtlich können Sie sich nicht auf JQuery verlassen, aber Sie erhalten die allgemeine Idee.

2

Vielleicht können Sie einen Iframe vom Typ text/html erstellen, den Inhalt in diesen schreiben und dann die Knoten wieder in die Hauptseite importieren.

+0

+1 für eine sehr kreative Idee, auch wenn die angenommene Antwort wahrscheinlich einfacher ist. – MatrixFrog

+0

Die im Frame geänderte URL wird im Browser nicht angezeigt, sodass der Benutzer keine bestimmte Seite zum Lesezeichen hinzufügen kann – cwtuan

Verwandte Themen