0

頭の領域にロードされる2つのスクリプトがあります。

    <script type="text/javascript">
       var myDate = new Date();
       var myStamp = ""+myDate.getDate()+myDate.getMonth()+myDate.getFullYear()+myDate.getHours()+myDate.getMinutes();
       document.write('<script type="text/javascript" src="https://scriptlocation.com/js/script.js?' + myStamp + '"><\/script>');
    </script>
    <script type="text/javascript">
       document.write('<script type="text/javascript" src=""https://scriptlocation.com/js/script2.js?'+SVNInfo.revision+'"><\/script>');
    </script>

私の理想的なシナリオは、これら2つを1つのjavascriptファイルにマージすることです。そのため、次の内容を含む新しいファイルを作成しようとしました。

       var myDate = new Date();
       var myStamp = ""+myDate.getDate()+myDate.getMonth()+myDate.getFullYear()+myDate.getHours()+myDate.getMinutes();
       document.write('<script type="text/javascript" src="https://scriptlocation.com/js/script.js?' + myStamp + '"><\/script>');
       document.write('<script type="text/javascript" src=""https://scriptlocation.com/js/script2.js?'+SVNInfo.revision+'"><\/script>');

ただし、スクリプトが正しくロードされていないため、これは機能していないようです。これを正しく機能させるには、何かを書き直したり変更したりする必要がありますか?

いくつかのアドバイスをいただければ幸いです。

4

2 に答える 2

2

これでうまくいくはずです。

<script type="text/javascript">
    var myStamp = (new Date()).getTime(), //easier way to get a relatively unique timestamp
        script1 = document.createElement('script'),
        script2 = document.createElement('script'),
        body = document.getElementsByTagName('body')[0];
    script1.setAttribute('type', 'text/javascript');
    script1.setAttribute('src', 'https://scriptlocation.com/js/script.js?' + myStamp);
    script2.setAttribute('type', 'text/javascript');
    script2.setAttribute('src', 'https://scriptlocation.com/js/script2.js?' + SVNInfo.revision); //is SVNInfo.revision defined?
    body.appendChild(script1);
    body.appendChild(script2);
</script>

記録のために、document.writeは、ページにスクリプトを追加する非常に原始的な(そして友好的な方法ではありません)。それらを要素として作成し、DOMに追加するだけです。

于 2012-11-11T03:05:32.770 に答える
2

SVNInfo最初のスクリプトで定義されます。したがって、最初のスクリプトを実行するまで、2番目のスクリプト(ソースパスにの値が含まれるSVNInfo)を含めることはできません。

document.writeブロックからコンテンツを作成すると、現在のブロックの終了タグの<script>直後にHTMLパーサーの新しいコンテンツが追加されます。</script>そのコンテンツ自体に<script>要素が含まれている場合、そのコンテンツ内のスクリプトは、現在のスクリプトが終了するまで実行を開始できません。したがって、</script><script>タグは現在のスクリプト実行を分割し、によって挿入されたスクリプトを実行できるようにdocument.writeします。これを壊さずに両方の書き込みを同じスクリプトに入れることはできません。

パーサーを完全に回避して、スクリプト要素をDOMに直接挿入することで、peteが提案する方法でそれを実行できる場合があります。パーサーが関与しないため、挿入されたスクリプトは、現在のスクリプトブロックが完了するのを待たずに、すぐに実行できます。

ただし、準備ができているsrc必要があるため、2番目のスクリプト要素のを設定する前に、最初のスクリプト要素がドキュメントに追加されて実行されていることを確認する必要があります。また、まだ完全に解析されていない要素に書き込むと、IEでページの読み込みが中止される可能性があるためではなく、要素SVNInfoにスクリプトを追加する必要があります。<head><body>

呼び出されたスクリプトから実行されることを期待する何かが2番目のスクリプトにある場合、これがまだ機能しない可能性もありdocument.writeます。スクリプトは圧縮されて読めないため、ここからは実際にはわかりません。

統合ドキュメントがあなたに何をしてほしいかを教えてくれることを考えると、私はそれに固執します。より良い方法があったとしても、将来のある時点で、2つのdocument.writeスクリプトに依存する方法でスクリプトが変更される可能性があります。

于 2012-11-11T03:26:40.167 に答える