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 で正しく動かない原因は探りたいと思います。

修正版は、下記からどうぞ。

Lingr通信用ライブラリ
http://inutch.xrea.jp/soft/lingrcom/

JavaScriptチャット
http://inutch.xrea.jp/soft/chatjs/