OperaでのJSONP問題
Opera で script タグ挿入による JSONP での非同期リクエストを行おうとすると、script の読込み完了まで次の処理が行われないという問題があり、LingrComでも同じ問題が発生していました。
この問題は、
http://labs.cybozu.co.jp/blog/takesako/2007/06/opera_img-jsonp.html
で解決されていたので、同じ方法で修正しました。
ただし、Lingr の通信ではどんどん script タグと img タグが増えていってしまうので、使用済みのタグはコールバック関数の最後で取り除くようにしました。下記の createJSONRequest でリクエストするJSONPのコールバック関数の最後で、createJSONRequest の返り値を引数として deleteJSONRequest を呼ぶようにしています。
createJSONRequest:function(url) { var uniqid = g_lingrcom_prefix_cnt++; var img = document.createElement('img'); img.setAttribute("src", url + "&noCacheIE=" + uniqid ); var obj = document.createElement("script"); img.onerror = function(e){ obj.setAttribute("type", "text/javascript"); obj.setAttribute("charset", "utf-8"); obj.setAttribute('src', url + "&noCacheIE=" + uniqid ); document.body.appendChild(obj); }; img.width = 0; img.height = 0; document.body.appendChild(img); return [img, obj]; }, deleteJSONRequest:function(obj) { for(var i=0; i<obj.length; i++){ if(obj[i]){ var pn = obj[i].parentNode; if(pn) pn.removeChild(obj[i]); } } },
この修正を入れると、Firefox では observe がタイムアウトになってしまい、IEではなぜかブラウザ自体がエラーで強制終了してしまうため、ブラウザの判定をいれて Opera 専用のコードとしています。
FirefoxでのJSONP並列実行の問題も同じ方法で解決できそうな気がするので、Firefox で正しく動かない原因は探りたいと思います。
修正版は、下記からどうぞ。