Safari2において、location.hashの書き換えで、2種類の意図せざる挙動を見せることを確認しました。
1つは、ページがリロードされ、onLoadイベントが再発生すること。
もう1つは、終わらない「読み込み中」の表示状態になることです。
再現プログラム §
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>test</title>
</head>
<body onload="alert('onload');">
<input type="button" onclick="location.hash = 'A';"
value="hashの'A'への書き換え"></input>
<input type="button" onclick="location.hash = 'B';"
value="hashの'B'への書き換え"></input>
</body>
</html>
このページをSafari2(412.2)にて開くと以下のような症状が発生しました。
- その時点でアドレス欄に入っているURLの末尾が"#A"ではないとき、"hashの'A'への書き換え"ボタンをクリックすると、ウィンドウのタイトルバーに「"test"を読み込み中」という表示が出たままになり、そのまま何も起こらない
- その時点でアドレス欄に入っているURLの末尾が"#B"ではないとき、"hashの'B'への書き換え"ボタンをクリックすると、ウィンドウのタイトルバーに「"test"を読み込み中」という表示が出たままになり、そのまま何も起こらない
- その時点でアドレス欄に入っているURLの末尾が"#A"のとき、"hashの'A'への書き換え"ボタンをクリックすると、"onload"というメッセージが表示され、onLoadイベントが実行されたことを示す
- その時点でアドレス欄に入っているURLの末尾が"#B"のとき、"hashの'B'への書き換え"ボタンをクリックすると、"onload"というメッセージが表示され、onLoadイベントが実行されたことを示す
ちなみに、Inrernet Explorer, Firefox, Operaでは、"onload"というメッセージが表示されるのは、ページを開いた最初の1回だけです。ボタンを押すことに対応して表示されることはありません。また、読み込み中のまま何も起こらないという現象もありません。
回避方法 §
onLoadイベントを実行させない方法は簡単です。同じ値への書き換えを発生させなければ良いのです。つまり、同じ値の場合は、そもそもlocation.hashに代入する必要がないわけで、条件判断をさせて代入しないようにすれば良いはずです。
しかし、読み込み中の表示がいつまでも続く問題については、回避するための上手いアイデアがありません。
もしも、誰かが私に良いアイデアを教えることができない場合、Safariではlocation.hashへの代入は使えないという結論になるかもしれません。