FirefoxでAjax中にF5押したとき

posted by cheesepie on 2009.08.07, under javascript
30th

Ajaxでのコンテンツ取得に時間がかかっている時に、画面をreloadすると、Firefoxだけreload後にエラー処理が実行された。

例えば、ブラウザ側では

$.ajax( {
  type: "get",
  url: "test.php",
  data: queryString,
  success: function(msg){
    alert( "Success! " + msg );
  },
  error: function( msg ) {
    alert( "Error! " + msg );
  }
} );

で、サーバ側では時間がかかるようにsleep(10)とかしといて、待ってる間にブラウザをreloadしてみます。
すると、XHRがabortされずにエラーハンドラが実行されちゃう。

エラーハンドラが実行されてしまうのは、リロードされるタイミングでreadyStateは4なのに、statusが0(ってか空っぽ)が返ってきて、エラー処理まで到達してしまうからなんだけど、XHRってreload関係なく引き継がれるのか。。。
IEとSafariはよしなにabortしてくれてるみたい。

Firefoxで”readyState”が4なのに”status”が0ってのは仕様らしくて、その場合”responseText”があるかどうかでabortするか判定できる。
ちなみにjQueryの$.ajax関数は対応してないorz
そもそも、まだレスポンスが返ってきていないので、readyStateは1を返すべきですが。

でもreloadのケースの場合、reloadされるタイミングでabortしないといけないので、上の対応をしてもどうしようもない。

ということで、MDCを見たら”onBeforeUnload”というドンピシャなイベントを発見。

$( document ).bind( 'beforeUnload', function() {
  xhr.abort();
} );

これでエラーが出なくなりましたー。ヒャッハー!
勉強になりました。

comment

TrackBack URL :

pagetop