hakobera's blog

技術メモ。たまに雑談

jQuery 1.4.2 の xhr.abort() が IE7 でエラーになる問題の回避方法

2010/10/18 追記 jQuery 1.4.3 が正式にリリースされ、この問題は解決されています。特に問題がない場合は jQuery 1.4.3 を使いましょう。


#6498 (XHR abort() method not working in IE7.)
– jQuery Core
- Bug Tracker

jQuery 1.4.2 のバグに3時間くらいはまっていたので、忘れないようにメモ。

回避方法

詳細は "Object doesn't support this property or method" from jQuery 1.4.1 in IE7 ONLY - jQuery Forum を参照してください。ここでは回避方法のみ記載します。
RC1 を製品に組み込むわけにはいかなかったので、今回は前者で対処しました。

ActiveX 版 XHR を使う

面倒なので、$.ajaxSetup で全体の動作をオーバーライド。

$.ajaxSetup({
  xhr: function() {
    if ($.browser.msie && $.browser.version.substr(0,1) <= 7) {
      return new ActiveXObject("Microsoft.XMLHTTP");
    } else {
      return new XMLHttpRequest();
    }
});

jQuery 1.4.3 RC1 を使う

jQuery Blog » jQuery 1.4.3 Release Candidate 1 Released

jQuery 1.4.3 RC1 では直っているっぽいので、それを使えばOK。
以下、jQuery 1.4.3 RC1 の修正された部分のコード抜粋

try {
  var oldAbort = xhr.abort;
  xhr.abort = function() {
    // xhr.abort in IE7 is not a native JS function
    // and does not have a call property
    if ( xhr && oldAbort.call ) {
      oldAbort.call( xhr );
    }
    onreadystatechange( "abort" );
  };
} catch( abortError ) {}

1.4.2 までは↓でした。

try {
  var oldAbort = xhr.abort;
  xhr.abort = function() {
    if ( xhr ) {
      oldAbort.call( xhr );
    }
    onreadystatechange( "abort" );
  };
} catch(e) { }