9 Stimmen

Verschachtelte document.writes und Drittanbieter-Anzeigen funktionieren nicht in IE!!!! Gibt es einen sicheren Workaround?

HINWEIS: Ich habe dies mit mehr Informationen darüber bearbeitet, was ich von der Drittanbieterseite zurückbekomme.

Kurz gesagt habe ich eine Aufgabe, einen JS-Anzeigen-Tag einzubinden, der auf unseren internen Ad-Server-Mechanismus verweist, der dann ein Skript eines Drittanbieters aufruft, das in ihre externe Datei schreibt... es wird nicht in IE funktionieren. Jemand hat mir mitgeteilt, dass verschachtelte document.writes in IE nicht funktionieren. Ich habe verschiedene Dinge ausprobiert... appendTo / writeln / Aufteilen des Skript-Tags / Dekodieren der Skript-Tags usw... nichts scheint zu funktionieren. Da dies für mich ziemlich neu ist, übersehe ich möglicherweise das Offensichtliche.

So sieht es aus:

Mein HTML:

   document.write('\x3Cscript type="text/javascript" src="_some_Path_to_internal_ad_server">\x3C/script>';);

Dieser Aufruf bringt etwas Code, der so aussieht: genau wie Sie sehen, keine umschließenden Skript-Tags.

   tl1 = '989';
   tl2 = 'xnlll';
   document.write('<\/script>');
</code></pre>

<p>Jetzt bringt "_some_Path_to_third_party.js" etwas js-Code, der document.writes und document.writeln enthält</p>

<p>Ich schreibe dies aus dem Kopf, also erinnere ich mich nicht genau daran, wie die Skript-Tags aufgeteilt sind, aber ich glaube nicht, dass das das Problem ist. Ich glaube, es sind die verschachtelten document.writes in IE. </p>

<p>Ich habe verschiedene Dinge ausprobiert und sogar meinen ersten Skript-Aufruf direkt auf meiner Seite platziert. Kein document.writes -- nur</p>

<pre><code><script language="JavaScript" type="text/javascript" src="_some_Path_to_internal_ad_server">
</code></pre>

<p>Kein Erfolg.</p>

<p>ABER ein direkter Aufruf des externen js hat funktioniert (meinen Aufruf an meinen internen Ad-Server entfernt, der dann den Aufruf an den Drittanbieter tätigt), so:</p>

<pre><code><script language="JavaScript" type="text/javascript" src="_some_Path_to_internal_ad_server">
</code></pre>

<p>Hat jemand Erfahrung damit, mit etwas Ähnlichem umzugehen und wie man es überwinden kann?</p></x-turndown>

3 Stimmen

Sidenote: Sprachattribut ist ungültig.

0 Stimmen

Im letzten von Ihnen veröffentlichten Skript meinten Sie _some_Path_to_third_party.js, oder?

0 Stimmen

Auch, in welchen Versionen von IE haben Sie getestet?

6voto

rsp Punkte 99616

Da Sie nicht genügend Details gepostet haben, um eine vollständige Antwort auf Ihr Problem zu schreiben (Sie schreiben: "Ich schreibe dies aus dem Stegreif, also erinnere ich mich nicht genau daran, wie die Skript-Tags aufgeteilt sind"), hier sind einige allgemeine Tipps, um Ihnen den Einstieg zu erleichtern, anstatt einer direkten Lösung. Sie sagen, dass Sie überzeugt sind, dass das Problem mit zu vielen document.write-Aufrufen zusammenhängt, daher werde ich mich darauf konzentrieren, ihre Anzahl wo immer möglich zu minimieren. Hoffentlich wird es Ihnen letztendlich ermöglichen, Ihr Problem zu lösen.

Zusätzliches Semikolon

In Ihrem ersten Beispiel haben Sie:

document.write(' ... ';);

Durch Entfernen des zusätzlichen Semikolons würde es sein:

document.write(' ... ');

Könnte das einige Probleme verursachen? Wenn nicht, dann lesen Sie weiter...

Zunächst einige Grundlagen:

Skripttyp und Sprache

</code></pre>

<p>Das Attribut "language" ist veraltet, verwenden Sie es also nicht. Das Problem mit dem Attribut "type" besteht darin, dass der MIME-Typ text/javascript veraltet ist (siehe <a href="http://www.ietf.org/rfc/rfc4329.txt" rel="nofollow noreferrer">RFC4329</a>) und application/javascript (der korrekte Typ) nicht universell unterstützt wird. In der Praxis wusste jeder Browser schon immer, dass es sich ohne "type" einfach um JavaScript handelt, und deshalb empfehle ich, es für jede Markup-Version, in der es optional ist, wegzulassen, wie z.B. HTML5. (Abgesehen davon sollte der MIME-Typ vom Server festgelegt werden.) Weitere Informationen finden Sie unter <a href="https://stackoverflow.com/questions/2267476/html-script-tag-type-or-language">dieser Frage</a>. Das gesagt habend, werde ich in den folgenden Beispielen einfach <code><script></code> verwenden.</p>

<h1>Minimierung von document writes</h1>

<p>Wenn dies in Ihrem HTML enthalten ist:</p>

<pre><code><script>
    document.write('\x3Cscript src="file.js">\x3C/script>');

ist genau äquivalent zu:

Es macht keinen Sinn, document.write in diesem Fall zu verwenden, es sei denn, Sie bauen den Skriptnamen dynamisch in JavaScript auf oder ähnliches, aber selbst dann können Sie es ohne document.write tun.

Wenn Sie den Pfad Ihres Skripts nicht kennen und z.B. eine JavaScript-Variable namens path verwenden, könnten Sie versucht sein, etwas Ähnliches wie dies zu schreiben:

    document.write('\x3Cscript src="' + path + '">\x3C/script>');

Aber Sie können mit etwas Ähnlichem wie dem, was Google für Analytics verwendet, ziemlich dasselbe Ergebnis erzielen:

var newScript = document.createElement('script');
newScript.src = path; // or newScript.src = 'file.js';
var firstScript = document.getElementsByTagName('script')[0];
firstScript.parentNode.insertBefore(newScript, firstScript);

Oder kürzer, mit appendChild:

var newScript = document.createElement('script');
newScript.src = path; // or newScript.src = 'file.js';
document.body.appendChild(newScript);

Oder einfacher mit jQuery:

$('', {src: path}).appendTo('body');
</code></pre>

<p>wo <code>path</code> die URL Ihres Skripts ist. Oder teilweise mit jQuery nur für die Einfügung in das DOM:</p>

<pre><code>var newScript = document.createElement('script');
newScript.src = path; // or newScript.src = 'file.js';
$('body').append(newScript);
</code></pre>

<p>Sie können möglicherweise auch jQuery.getScript verwenden:</p>

<pre><code>$.getScript(path);
</code></pre>

<h1>Weitere Ideen</h1>

<p>Weitere Ideen finden Sie unter:</p>

<ul>
<li><a href="https://developers.google.com/analytics/devguides/collection/gajs/" rel="nofollow noreferrer">Google-Analytics-Code asynchrone Syntax</a></li>
<li><a href="https://developers.google.com/analytics/devguides/collection/gajs/gaTrackingOverview" rel="nofollow noreferrer">Google Analytics-Code traditionelle Syntax</a> (mit <code>document.write</code>)</li>
<li><a href="http://api.jquery.com/jQuery.getScript/" rel="nofollow noreferrer">jQuery getScript</a></li>
<li><a href="http://yuilibrary.com/yui/docs/get/" rel="nofollow noreferrer">YUI Get</a></li>
<li><a href="http://requirejs.org/" rel="nofollow noreferrer">RequireJS</a></li>
</ul>

<p>Dies sind einige grundlegende Dinge, die Sie tun können, um die Verwendung von <code>document.write</code> zu minimieren. Hoffentlich wird Ihnen das den Einstieg erleichtern.</p></x-turndown>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X