読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

サイトの後処理にはonpagehideを使う

[2014-09-25 追記]
iOS8 Safariではload/unloadがdepricatedになって、pageshow/pagehideという名前になりました。これに伴い、下記で使っていた従来のpageshow/pagehideは廃止。
以下の記事はiOS7もしくはそれ以前の情報です。

iOS Safariではonbeforeunloadがトリガーされません。
onunloadはキャッシュの条件によってトリガーされたりされなかったりするようです。
onpagehideを使いましょう。

window.onpagehide = function() {
  navigator.geolocation.clearWatch id 
};

geolocation APIのclearWatchを実行するタイミングを探していて上記結論となりました。
ちなみに、geolocation APIでwatchPositionしてclearWatchをしないと、何度か使用した後、どのURLをアクセスしても"JavaScript execution timeout"が発生して、JavaScriptがまともに動かなくなります。Safariのプロセスを一旦殺す必要あり。

jQuery Mobileの<div data-role="page">のpagebeforehide, pagehideはマルチページの内部ページ遷移でのみ発生し、外部サイトへの遷移の際には発生しません。
window.onpagehideが確実な唯一のイベントです。(マルチページの場合、内部ページ遷移毎にonpagehideが発生するので処理内容について注意が必要です。)

また、残念なことに「ホーム画面に追加」をして「アプリ化」すると、ホームボタンやタスク切り替えでバックグラウンドに入る際にはonpagehideも発生しません。(IOS5 Safari)従って、現状では後処理が必須のウェブアプリは「ホーム画面に追加」はできないことになります。PhoneGapはバックグラウンドに入る際にpauseイベントが発生するので後処理が可能です。(が、誰でもインストールできるようにするにはApp Storeへの登録が必要です。)