Javascriptページで実行する順序


一、HTMLにJavasriptを埋め込む方法
  • 直接Javascriptコードをマークペアとスクリプトの間に置く
  • によりマークされたsrc属性により外部のjsファイル
  • を作成する.
  • は、例えば、<p onclick="alert('我是由onclick事件执行的Javascript')">点击我</p>
  • のようなイベントハンドラに置かれています.
  • はURLの主体として、このURLは特別なJavascriptを使用します.例えば、<a href="javascript:alert('我是由javascript:协议执行的javascript')">点击我</a>
  • Javascript自体のdocument.writeを利用して、新しいjavascriptコード
  • を書き込みます.
  • Ajax非同期を利用してjavascriptコードを取得し、
  • を実行する.
    第3と第4の方法で書かれたJavascriptはトリガが必要ですので、特別に設定しない限り、ページローディングは実行されません.
    二、Javascriptページでの実行順序
  • ページのJavascriptコードはHTMLドキュメントの一部であるため、Javascriptはページのロード時に実行する順序は、その導入マークの出現順序であり、マークの中やSrcによって導入された外部JSは、その文の出現順に実行され、実行プロセスはドキュメントの一部である.
  • 各スクリプトによって定義されたグローバル変数と関数は、後に実行されるスクリプトによって呼び出されてもよい.
  • 変数の呼び出しは、前に宣言されている必要があります.そうでないと取得された変数値はundefinedです.
    <script type="text/javscrpt">//<![CDATA[
    alert(tmp);  //输出 undefined
    var tmp = 1;
    alert(tmp);  //输出 1
    //]]></script>
  • 同じセグメントのスクリプトでは、関数の定義は、関数の呼び出しの後に現れることができますが、それぞれ2つのセグメントのコードであり、関数の呼び出しが第1のセグメントのコードであれば、エラーを報告する関数は定義されていません.
    <script type="text/javscrpt">//<![CDATA[
    aa();            //浏览器报错
    //]]></script>
    <script type="text/javscrpt">//<![CDATA[
    aa();			//输出 1 
    function aa(){alert(1);}
    //]]></script>
  • document.write()はスクリプトドキュメントがある場所に出力を書き込み、ブラウザでdocumemt.write()がある文書の内容を解析した後、document.write()が出力した内容を解析し続けてHTMLドキュメントを解析しています.
    <script type="text/javascript">//<![CDATA[
        document.write('<script type="text/javascript" src="test.js"><\\/script>');
        document.write('<script type="text/javascript">');
        document.write('alert(2);')
        document.write('alert("我是" + tmpStr);');
        document.write('<\\/script>');
        //]]></script>
      <script type="text/javascript">//<![CDATA[
        alert(3);
        //]]></script>
    test.jsの内容は:
    var tmpStr = 1;
        alert(tmpStr);
  • FirefoxとOperaのポップアップ値の順序は、1、2、私は1、3
  • です.
  • において、IEで値をイジェクトする順序は、2、1、3であり、同時にブラウザのエラーを報告する:tmpStrは
  • を定義していない.
    理由は、IEがDcument.writeの時に、SRCのJavascriptコードのロードが完了してから次の行を実行しないため、2が先にポップアップし、Dcument.write('document.write("私は"+tmpStr")に実行した場合、tmpStrは定義されていないためです.この問題を解決するには、HTML解析を利用してHTMLタグを解析し終わったら、次の原理を実行して、コードを分割して実現できます.このようにIEの下で、他のブラウザと出力値の順番はずっと続いています.1、2、私は1、3です.三、どのようにJavascriptのページでの実行順序を変えますか?
  • オンロード
    <script type="text/javascript">//<![CDATA[
        document.write('<script type="text/javascript" src="test.js"><\\/script>');
        //]]></script>
      <script type="text/javascript">//<![CDATA[
        document.write('<script type="text/javascript">');
        document.write('alert(2);')
        document.write('alert("我是" + tmpStr);');
        document.write('<\\/script>');
        //]]></script>
      <script type="text/javascript">//<![CDATA[
        alert(3);
        //]]></script>
    を利用して出力される値の順序は2、1です.注意したいのは、複数のwindows.onloadが存在する場合、最も有効なのは、2級DOMイベントタイプ
    <script type="text/javascript">//<![CDATA[
    window.onload = f;
    function f(){alert(1);}
    alert(2);
    //]]></script>
  • を利用して解決することです.
  • IEではdeferを利用してもいいです.deferはコードを読み込んですぐに実行しません.ファイルの読み込みが終わったら実行します.window.onloadに似ていますが、window.onloadのような制限がなくて、繰り返し使用できます.しかし、IEの中でのみ有効です.上記の例は
    window.onload = function(){f();f1();f2();.....}
    に変更できます.出力値の順序は、1、3、2、私は1です.HTML解析器がスクリプトに遭遇した時、通常のドキュメントの解析を終了し、スクリプトの実行を待つ必要があります.この問題を解決するためにHTML 4規格はdeferを定義しています.deferでブラウザにヒントを与えると、HTMLドキュメントの解析を継続し、スクリプトの実行を遅延させることができます.この遅延は、スクリプトが外部ファイルから読み込まれるときに非常に有用であり、ブラウザが外部ファイルの全てのロードを待ってから実行を継続する必要がなく、効果的に性能を向上させることができる.IEは現在唯一のDefer属性をサポートしているブラウザですが、IEは正確にdefer属性を実現していません.遅延されたシナリオは常に遅延されていますので、ドキュメントの終了は次の遅延なしのスクリプトに遅延されることを知っています.これは、IEにおいて遅延されたシナリオの実行順序がかなり乱れており、後の非遅延シナリオのいずれかを定義することができない関数および変数を意味する.IEの中のすべてのdeferのスクリプトの実行時間はすべてHTMLファイルツリーが設立された後、window.onloadの前にあるはずです.
  • はAjaxを利用する.xmlhtpRequestは外部ドキュメントのロード状態を判断することができますので、コードのロード順序を変更することができます.