history.back()で戻るとscrollイベントが取得できない

ハマったのでメモ。

挙動はタイトル通りなんだけど、iPhoneのSafariでhistory.back()を使用すると戻った画面でscrollイベントが取得できない模様。以下でscrollイベントを検出しようと3つを試してみたけどどれもだめ。

// jQueryで普通に
$(window).scroll(function() {
   console.log('scroll now');
});

// イベントにbindしてみる
$(window).on('scroll', function() {
    console.log('scroll now');
});

// 生のjavascriptで
window.onscroll = function() {
    console.log('scroll now');
};

history.back()で戻る前はどれもログが出力されるけど、戻った後は出力されない。Android標準ブラウザだと検出されるからiPhoneのSafariのバグなんじゃないかと疑っている。そもそもiPhoneのSafariとAndroid標準ブラウザだとscrollのイベント検出タイミングが

  • iPhoneのSafari:Scrollが完了したタイミングでイベント発生
  • Android標準ブラウザ:Scrollが発生している最中は定期的にイベントが発生し続ける

という風に違う。

PCブラウザだと、Android標準ブラウザと同じ挙動をするものが多い(*1)のでどうもiPhoneのSafariのScrollイベントとのbindがうまく動いてないんじゃないかと予想。position:fixed;のバグといい、iPhoneのSafariって出来が悪い気がする。ちなみにiOSの5.0で試してみました。なにか打開策をご存知のかたは教えてください。

追記

一応思いつく回避策を列挙。どれもぱっとしない。。。

  • history.back()を使わずに、location.hrefで頑張る
  • scrollイベントを使わずに、touchmoveイベントで頑張る
  • history.back()で戻ってきた場合は強制リロード

*1: Chrome, Firefoxで試した