2012年08月02日
川俣晶の縁側ソフトウェア技術雑記 total 5145 count

jQuery使用時に定義されているはずのオブジェクトが未定義と言われる問題

Written By: 川俣 晶連絡先

 何日間悩んだか分かりません。しかし、やっとどうやら原因を突き止めたようです。

問題 §

 jQueryとjQuery Mobileを"code.jquery.com/mobile"を参照しているページで、キャッシュクリア直後に開いたとき、しばしば定義済みであるはずのオブジェクトが定義されていないエラーになる。ずっとロード中で戻って来ないこともある。

原因 §

 "code.jquery.com/mobile"が返すデータが不正となるケースがある。これが空の時は、読み込みエラーにはならないが、オブジェクトが見つからないエラーになる。データを返せないときには永遠にロード待ちになる場合もある。キャッシュにある時には問題が起きないので、キャッシュクリア後に発覚する。

 特定環境だけの問題か否かは分からない。

解決 §

 script要素で"code.jquery.com/mobile"を参照しない。別のCDNを使うか.jsファイルをローカルに置く。

感想 §

 まるで非同期にスクリプトを読み込んでいるかのような挙動だったので間違った方向で探索を続けてしまいました。しかし、結果はこんなもの。しかし、一時は迷宮入りかと思った問題ですが、諦めないで調査して良かったなぁ。

 おかげでスクリプトのロード関係はかなり詳しくなりましたよ。beforescriptexecuteイベントとafterscriptexecuteイベントはFirefoxには実装されているがIE10には実装されていないとか、jqueryMobile使用時にbody下のscript要素は2回評価される(ツリーの再構成が行われるから)が、head以下なら1回だとか、そういった変なことまで分かりましたよ。