Opera の window.onunload の挙動
ソースだけおいておきます。詳しい更新は夜に。
同日 22:30頃 説明を追加。
JavaScript如きとどうして格闘しなきゃいけないんだ! - 血統の森+はてな で 書かれている駄文にゅうすのフォントサイズ切り替えスクリプトが Opera で動かない件ですが、以下のように修正すれば動きます。
function setActiveStyleSheet(title) { var i, a, main; for(i=0; (a = document.getElementsByTagName("link")[i]); i++) { if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) { a.disabled = true; if(a.getAttribute("title") == title) a.disabled = false; } } createCookie("style", title, 365); //追加部分 } //window.onunload の処理は削除。
2007-08-03 追記:デモページ。駄文にゅうすさんにメールするときに、あった方が良いなと思って、作成したもの。いちおうこっちからもリンクしておきます。あと、念のために書いておくと、このスクリプトは、application/xhtml+xml では動かないので、上記リンク先は、text/html です。application/xhtml+xml でも動くスクリプトは、CSS切替スクリプト - 徒委記 にあります。
以下、技術メモ
上記のスクリプトは元々、window.onunload 時に Cookie を発行することによって、訪問者が指定したフォントサイズを保存し、次回訪問時も、同じフォントサイズでページを表示するというスクリプトです(詳しく参照したい人は:Alternative Style: Working With Alternate Style Sheets · An A List Apart Articleへ)。上記の修正は、Cookie の発行をフォントサイズの変更時に行うというものです。
元のスクリプトでも、Archive ページへのリンクをクリックするなどして、ページ遷移することによって、Opera でも、 Cookie を発行することができます。つまり、Opera の window.onunload は、ページ遷移でしか発生しないイベントであり、ウィンドウを閉じたり、リロードするだけでは、発生しないという、非常に発生条件が限定されたイベントなのです。このような仕組みでは、上記のような処理をするスクリプト向けではないので、確実に発生する処理内で Cokkie を発行するように修正したわけです。
英語になりますが、以下 URL にも説明があります。test page も用意されていますので、検証はそちらで。
Javascript - Event compatibility tables
ちなみに
IE の挙動はよくわかりません。
参照:http://oshiete1.goo.ne.jp/qa1413386.html
window.onunload をクロスブラウザで使うときは、ページ遷移時に動作させることを前提にした方が良さそうです。