Olen onnellinen.

あしたもどこかで NullPointerException。資格試験とかシステム開発の記録だったりなかったり。

JavaScript:実行順のなぞ

JavaScript なんて嫌いだーと逃避していたけど、現実は甘くない。最近は必須なのです。


クロスドメインの制約のため、XMLHttpRequest では他のドメインにリクエストを投げられないのです。そこで出てきたのが JSONP とかって呼ばれるやつ。

これは別ドメインだろうが script タグの src 属性に指定すれば実行できるよねーという方法です。
んで web サービスみたいのとかだとコールバックパラメータみたいなのが用意されていて、実行結果をコールバック関数で受けてふがふが…とします。

ここではまった。
例えばこんなコードです。

  1.  <html>
  2.  <head></head>
  3.  <body>
  4.  <script type="text/javascript">
  5.  <!--
  6.  if (window.addEventListener) {
  7.      window.addEventListener('load', test_func, false);
  8.  } else if (window.attachEvent) {
  9.      window.attachEvent('onload', test_func);
  10.  }
  11.  function test_func(e) {
  12.      var head = document.getElementsByTagName("head").item(0);
  13.      var script = document.createElement("script");
  14.      script.setAttribute("type", "text/javascript");
  15.      script.setAttribute("charset", "EUC-JP");
  16.      script.setAttribute("src", "./test.js");
  17.      head.appendChild(script);
  18.      alert("test_func");
  19.  }
  20.  function cb_func() {
  21.      alert("cb_func");
  22.  }
  23.  -->
  24.  </script>
  25.  </body>
  26.  </html>


外部 js は下のように外部ドメインで良い、と。

  1.  script.setAttribute("src", "http://betu/test.js");


ここで呼び出している test.js のコードは

  1.  cb_func()


これだけ。
上の html をブラウザで開くと、test_func, cb_func の順でアラートがあがります。
つまり、appendChild でスクリプトを貼り付けた時点ではtest.jsが実行されていないのです。
この順番を逆にするにはどうすればよいのだろうか。

グローバル変数を用意して無限ループしてみてもダメっぽいから非同期とかじゃなくて実行順が決まってるようで。

ふーん。

このエントリーを含むはてなブックマーク | 
Copyright © 2008 hydra404 all rights reserved.