9

大規模で高負荷のプロジェクトに取り組んでいると、フォーラムやブログですでに数十億のトピックで説明されている問題が発生しましたが、私の場合に役立つ解決策はありません。これが話です。

バナーの HTML コードがありますが、コードがわかりません。プレーンな HTML の場合もありますが、その<script>中に document.write を含む<script>タグであり、その中に src to doubleclick network を含むタグがある場合もあります。

つまり、script > document.write > script(doubleclick) です。

ご存知かもしれませんが、doubleclick ネットワークは document.write も使用し、ほとんどの場合、もう 1 つの js ファイルをロードする必要があるフラッシュ バナーを表示します。

結局のところ、script > document.write > script(doubleclick) > document.write > script > ...

これは、HTML に直接配置するとうまく機能します。ページ レンダリング 1 の部分、バナー 1 のロード、ページのレンダリングの維持、バナー 2 のロード、ページ レンダリングの終了。

しかし、今は最初にページをレンダリングする必要があり、その後にバナーをロードする必要があります。バナーは document.write を使用するため、window.onload イベントの前にロードする必要があります (注意: window.onload の後、document.write はドキュメント全体を書き換えます)。

私がやったこと:

head セクションには、プロパティ スコープを持つバナー オブジェクト (実際の名前空間の種類は巨大です :)) があります。

ページのレンダリングとバナー コードが一致したら、バナーのコードをスコープに配置して配置し<div id="bannerPlaceHolder"+id></div>ます。ここでは、後でバナー コンテンツを配置する必要があります。

ページがレンダリングされ、</body>タグの前に<script>banners.load()</script>banners.load メソッドを配置すると、スコープ配列内の各アイテムに対して次のことが行われます。

document.write('<div id="codeHolder'+id+'">');
document.write(bannerCode);
document.write('</div>');

そして、この後にのみ、これをwindow.onload()行うイベントがあります:

すべてのバナー codeHolders を取得し、ノードごとに codeHolder から placeHolder にノードを追加するため、ページをレンダリングした後にバナーが読み込まれ、バナーは適切な場所に配置されます。

IE 以外はすべて完璧です。DOM に動的に配置された js スクリプトを非同期でロードするため、doubleclick スクリプト内の document.write は、codeHolder ノードではなく、ドキュメントの最後にノードを追加します。いつものようにIEのみです。

解決策を知っている人には本当に感謝しています。

4

6 に答える 6

3

writeCapture.jsが必要です(完全な開示: 私は著者です)。すべての賭けは、サード パーティのスクリプトでオフになっています。今日、彼らはdocument.write特定の HTML を生成するために使用していますが、明日はそれを変更する可能性があり、置換に基づく単純なハックをdocument.write更新する必要があります。writeCapture がそれを処理します。あなたの使い方は次のようになります:

$('#bannerPlaceHolder').writeCapture().html('<script type="text/javascript" src="http://doubleclick.net/bannerCode.js"></script>');

このライブラリは任意の深さのスクリプト タグを処理でき、散在する HTML を問題なく処理します。jQuery を使用しない場合は、スタンドアロン ビルドもあります。

于 2009-12-29T16:36:11.800 に答える
1

通常、バナーでは正確な寸法と配置がわかっているので、bnerCode にあるコンテンツを使用して iframe を動的に作成する方法はどうでしょうか。それだけです。

于 2008-12-12T16:55:12.670 に答える
0

iframeソリューションは醜いと思います。バナーを別のページにロードして、それらをDIVにAJAXできないのはなぜですか?

于 2009-04-22T13:54:03.707 に答える
0

非表示の(サイズ0x0)iframeにロードしてから、javascriptを使用して別の場所に移動します

于 2009-02-17T11:16:11.937 に答える
0

document.write() 呼び出しを個別のタグに分割すると、出力は次のようになります。

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

document.write('');

IE は、document.write(bannerCode) の準備が整い、終了タグが書き込まれるまで待機します。

于 2009-09-23T13:26:40.100 に答える
0

おそらく、プロパティ innerHTML を使用できます: document.getElementById("x").innerHTML=".................";

または、DOM: CreateElement および AppendChild を使用できます。

于 2008-11-24T21:37:03.273 に答える