8

scriptスクリプトが実行されたときのドキュメントの最後の要素*** が現在実行中のスクリプトであると想定しても安全ですか?

たとえば、ページの本文のどこにでもドロップでき、要素を同じ場所に表示できるスクリプトを作成したいと考えています。私はこのようなことをしています:

function getCurrentScriptElement() {
    var scripts = document.getElementsByTagName('script');
    return scripts[scripts.length - 1];
}

var script = getCurrentScriptElement();
var view = document.createElement('span');

/* Put stuff in our view... */

script.parentNode.insertBefore(view, script);

スクリプトがドキュメントの本文にあると仮定すると、これは「安全」ですか? getCurrentScriptElement関数は常に実行中のスクリプトを返しますか? そうでない場合、どうすればそれを行うことができますか?

スクリプトを特定の id 属性などに結び付けずにこれを行いたいのですが、位置的にしたいだけです。


このスクリプトを取り込む例をここに作成しました。1 つの回答は、他のスクリプトが、このような例が壊れる状況を作り出す可能性があることを示唆していました。この例を壊す他のスクリプトをこの例に追加することは可能ですか?


deferまたはasync属性を持つ他のスクリプトがこれを破る可能性があることが示唆されました。そのようなスクリプトがどのように機能するかの例を誰か挙げることができますか?

私が理解しているように、defer最初にDOMをロードしてから、deferタグを使用してスクリプトを実行することを意味します。defer別のスクリプト要素に表示される属性は、 の動作にどのように影響しgetCurrentScriptElementますか?

async、私が理解しているように、そのスクリプトのフェッチを開始し、同時にDOMの解析を続けることを意味します.待つ必要はありません...しかしスクリプトにヒットすると、停止して待機する必要がありますよね?

どちらかがどのように影響するかわかりません。誰か例を挙げてもらえますか?


* この質問では、外部スクリプトのみに関心があります。

**scriptドキュメント全体の最後の要素ではなく、script実行時のドキュメントの最後の要素。ドキュメントの残りの部分はまだロードされていないはずですよね?

4

3 に答える 3

5

絶対にないという保証ではありません。この JSFiddle をチェックしてください: http://jsfiddle.net/jAsek/

<!DOCTYPE html>
<title>Test case</title>
<div>
    <p>At the start</p>
    <script id="first">
        var scr1 = document.createElement("script");
        scr1.setAttribute("id", "early");
        document.body.appendChild(scr1);
    </script>
    <p>After the first script</p>
    <script id="second">
        function getCurrentScriptElement() {
            var scripts = document.getElementsByTagName('script');
            return scripts[scripts.length - 1];
        }

        alert(getCurrentScriptElement().id);
    </script>
    <p>At the end</p>
</div>

ここで、アラートは、現在実行中のスクリプト「second」の ID ではなく、挿入されたスクリプト「early」の ID を報告します。

内部スクリプトと外部スクリプトの間に実質的な違いはありません。

于 2013-01-19T01:54:08.870 に答える
1

ブラウザーは、さまざまなことに応じて JavaScript コードをまったく異なる方法で実行するため、これは安全な仮定ではないと思います (ヘッドに他のスクリプト要素がある場合、それらが外部にある場合など)。

カスタムIDまたはクラスを持つダミー要素を使用するように人々に要求するだけです. そうすれば、スクリプトを複数回実行することなく、ページを複数回実行することも可能になります。

これは、Google の +1 ボタンなどのウィジェットを使用するときにも行われます。

document.write別の方法は、スクリプトの実行中に追加のコンテンツを書き込むために使用することです。ただし、これは script タグを置き換えるのではなく、単に何かを追加するだけです。

于 2013-01-19T01:03:52.997 に答える