location.hash

javascriptでlocation.hashとすると,現在のURLの#以降の値を#を含めて取得することができる.
例えば,URLがhttp://www.hoge.jp/#fooだった場合,location.hashの値は,#fooとなると思う.
これがIceweasel(3.0.3)とIE(6)ではどうも挙動が違うっぽい.ちなみにOSは,Debian(lenny)でIEはwine上で動作させたもの.
あれ?と思ったのでメモっておく.



#以降の文字列がencodeURIComponentなんかでエンコードされてると変わってくるみたい.
Iceweaselだとエンコードされた文字列がデコードされたものが返される.
IEだとエンコードされた文字列そのままが返される.
まあ,テストページ作ってみたんで,こんな感じ.

このページでまず,テストというアンカータグをクリックするとURLが,「http://www.oti-orz.mydns.jp/~khiker/test.html#http%3A%2F%2F」のようになる.
「http%3A%2F%2F」は,「http://」をencodeURIComponentでエンコードしたもの.
その状態でlocation.hashとすると,Iceweaselの場合,「#http://」となり,IEの場合,「http%3A%2F%2F」となる.
Iceweaselだと勝手にデコードしてる……?


javascriptでページ遷移させないでかつURLに情報を残したいなと思って,アンカータグのhref属性の値に#からはじまる文字列を入れるのを作ってて気付いた.
inputタグ(text)の内容を「#search/検索内容」みたいな感じでURLの最後にくっつけるようにして,location.hashで#以降を取得,split関数を使って文字/で区切る.
ということやってたのだけど,検索内容に/を入れると,Iceweaselの場合上手くいかなくて悩んだ.
ちなみにそのアプリ.ネトラジビューワ開発版.これ↓
# 開発途中だからバグがあるだろうし,リンク先がなくなったりする可能性あり.あと、このページ直接いじって作業してるから変な挙動したりするときがあるかも。

  • ttp://www.oti-orz.mydns.jp/~khiker/webapp/live-beta.html

こいつでは、location.hashは使わないで、locationの値から#移行を取り出して使ってる。


Iceweaselだからこうなのか,こういう仕様なのかわからないけど,勝手にデコードしてくれるのはちょっとなあと思った.
ちなみに,Firefoxでどうなるかは調べてない.



なんかよくないんだけど,締切が近いと別のことをしたくなる……w

追記

konqueror(3.5.9)とopera(9.62)でも試してみた。
両方、IEと同じように「http%3A%2F%2F」が返されて、デコードはしてなかった。どゆこっちゃろ?

追記の2


友人にやってもらた。
Firefox3.0.4(vista)だと、やはり、location.hashの結果は「http://」となり自動でデコードしてる模様。
IE7(vista)だと、「http%3A%2F%2F」となりデコードしてない。
やはりFirefoxだけかってにデコードするっぽ。

更新時刻

  • 2008/12/02/08:40
  • 2008/12/02/21:45
  • 2008/12/02/23:52