document.writeの素晴らしいストーリー

document.writeメソッドは、最も奇妙なメソッドの1つです。 ページのすぐ後にHTMLコードを埋め込みます。 より正確には、その内部にある<script>タグの直後。 そして、ドキュメントがまだ完全にダウンロードされていない場合のみ。 そして、あなたがいた場合は? 次に、ページがクリアされ、示されたものに置き換えられます。

ページの残りの部分を明確に区切る行を挿入できます。

 document.write('<plaintext>') 

または、ロシアンルーレットをプレイできます。

 if (Math.random() > 0.9) document.write('<!--') 

テキストが<script>タグの直後挿入されるという事実が重要であることがわかります。 例:

 <script> document.write('<script src="jquery.js"></' + 'script>'); alert(jQuery.guid) </script> 

このコードは、jQuery変数が宣言されていないというエラーをスローします。
一方、

 <script> document.write('<script src="jquery.js"></' + 'script>'); </script> <script> alert(jQuery.guid) </script> 

また、最初のタグからロードされたスクリプトが完全に処理されるまで、2番目の<script>タグの実行が開始されないため、このコードはエラーなしで実行されます。

さらに、それはますます好奇心が強くなります。 そのようなコードがあると想像してください:

 <script> console.log('a'); document.write('<script src="printC.js"></' + 'script>'); console.log('b'); </script> <script> console.log('d'); </script> 

また、 printC.jsファイルには次のものが含まれています。

 console.log('c') 

このコードは、コンソールに次を出力します。

 a b c d 

この例は、 document.write後の最初の<script>からのすべてのコードがすぐに実行されたが、 2番目のタグはprintC.jsが作業を完了した後にのみ実行を開始したことをprintC.jsています。

覚えておく必要があります。 コンテンツを挿入するこの方法は、ドキュメントの読み込み中に直接機能するだけです。 既にロードされた後にdocument.writeを呼び出すとどうなりますか? エラーを与えるか、何もしないのは論理的です。 代わりに、既存のページ全体が消去され、渡された文字列がその場所に表示されます。

 setTimeout(function(){ document.write("Oops"); }) 

document.writeを使用する通常の理由はありdocument.writeか?


私はこれを聞いたことがありません。 どうやら、ユーザーがNetscape 2を介してサイトにアクセスした場合、AJAXリクエストの代わりに追跡画像を表示できるため、バナーツイスターで使用されているようです。現代の世界では、彼は何も必要としません。

確かに、 document.write呼び出しに渡すHTMLを静かにラップするすばらしいツールがあります。

document.write内でdocument.writeを呼び出すことは可能ですか?


うん!

何度も何度も?


いいえ、20回。

ほんと? 二十?


うん

Google Chromeは間違いなく、より高度なブラウザです。最大21回まで使用できます。

彼らは、互いに独立して、これを考えていますか?


Firefox開発者は、ブラウザをドロップする可能性のあるバグを修正した最初の人であり、Webkit開発者はソリューションをコピーしました。 IEにも制限があるという噂がありますが、それはさらに低いです。

ブラウザをさらに高速で破壊することは可能ですか?


 <div id="uniqid"> <script language="JavaScript" type="text/JavaScript"> document.write(">"+document.getElementById('uniqid').innerHTML+"<"); </script> </div> 

(コードはチケットから取得されます)

document.writeを使用して他にどんなナンセンスを行うことができますか?


はい、あります!

たとえば、 同期 AJAXリクエストを作成し、その結果をページの本文に直接貼り付けることができます。

 x = new XMLHttpRequest() x.open('GET', "", false) x.send() document.write(x.responseText); 

リクエストを送信すると、メインページのロードがブロックされ、レスポンスのコンテンツは、ロードされたページに元々あったかのように挿入されます。 この場合、URLの代わりに空の文字列が渡されたため、同じページが読み込まれ、それ自体が再び読み込みを開始します。

*「無限に」とは20回を意味します。 または21。IEを使用している場合はさらに少ない。

一般に、 多くの方法で楽しむことができます

他に何か?


これは現在の仕様にはありませんが(以前のバージョンにはありましたが)、いくつかのパラメーターをdocument.write渡すことができます。例えば:

 document.write("", "", "", "", "", ""); 

メソッドが役に立たない場合、なぜ私はそれについて読んでもいいのですか?


しかし、これは本当に良い質問です!

翻訳者注:

奇妙なことに、ページをロードした後のdocument.write最初の呼び出しのみがそのコンテンツをクリアします。 後続の呼び出しは、最初の後にテキストを追加します。

Source: https://habr.com/ru/post/J305366/


All Articles