hash

Location インターフェイス hash 属性 (DOM)

仕様書

性質

[38] この属性は、 Unforgeable です >>12

取得器

[16] location.hash取得器は、次のようにしなければなりません >>12

  1. [24] 文脈オブジェクト関係するDocument起源入口設定群オブジェクト起源同じ起源ドメインでなければ、
    1. [25] SecurityError 例外投げ、ここで停止します。
  2. [26] URLを、文脈オブジェクトURL に設定します。
  3. [27] URL素片null空文字列なら、
    1. [14] 空文字列を返します。
  4. [15] それ以外なら、
    1. [28] #URL素片を連結したものを返します。

設定器

[29] location.hash設定器は、次のようにしなければなりません >>12

  1. [39] 入力を、与えられた値を USVString として解釈した結果に設定します。
  2. [30] 文脈オブジェクト関係するDocument起源入口設定群オブジェクト起源同じ起源ドメインでなければ、
    1. [17] SecurityError 例外投げ、ここで停止します。
  3. [18] 複製を、文脈オブジェクトURL に設定します。
  4. [35] 入力の先頭が # なら、これを削除します。
  5. [36] 複製素片を、空文字列に設定します。
  6. [37] 入力基本URL構文解析を適用します。 URL複製状態上書きfragment state とします。
  7. [21] 文脈オブジェクト複製について Location-object-setter navigate を実行します。
[23] URL schemejavascript: になる場合があるのかは謎です。

[22] location.hash = "" は、素片識別子を除去するのでなく、 空文字列に設定します。

歴史

[1] location.hash, Gecko では百分率符号化 (URI符号化) が復号されていて、 WinIE では復号されていないという罠。 (hash 以外も非互換な悪寒。)

回避するには、 location.href を使うがよろし。

function getFragment (uri) {
  var fstart = uri.indexOf ('#');
  if (fstart == -1) return null;
  return decodeURI (uri.substr (fstart + 1));
// 百分率符号化したままがよいなら
//   return uri.substr (fstart + 1);
}
var fragment = getFragment (location.href);

正規表現でさらりとこなす例

var fragment = decodeURI (location.href.replace (/^.*#/, ""));
// 百分率符号化したままがよいなら
//   var fragment = location.href.replace (/^.*#/, "");

[2] location.hash <http://ma.la/mirrorman/wiki.cgi/location.hash>

location.hash (素片識別子) にセッション情報を保存しようという試み。 同じことを考えてる人がいたとは。

[3] Merge and Context Ids <http://www.helpware.net/htmlhelp/how_to_merge_ctx2.htm>

HTML Help 内の redirect に素片識別子を使うという話。 (名無しさん)

[4] web拍手登録版を加工・改造・実験・検証 <http://web1.nazca.co.jp/hp/macde/commonmailform/webclap.html#gratitude2> (2004年9月付け)

利用者の入力に対する反応 (頁内容の変化) をスクリプトと素片識別子により行っています。 (名無しさん [sage])

[5] はじめの #: 素片識別子の前に来る区切子# は、 hash の取得では (元の URI にあれば) 常につきますが、 値の設定ではなくてもよいようです。 (名無しさん)

[6] URI 符号化: URI 全体として Gecko は必要に応じて (URI で使えない文字があれば) 百分率符号化し、 WinIE は必要であっても放置するようです。

hash で取得できる値は Gecko では UTF-8 として復号された状態、 WinIE では百分率符号化 (されていれば) されたままの状態です。

(名無しさん)

[7] この属性が存在する物体: この属性は DOM水準0 ですが、 location 物体のみならず、 href 属性や src 属性がある要素の DOM 属性として (他の location 系属性と共に) 存在しています。

(名無しさん)

[8] 値の設定による移動: 値を設定すると、 他の状況で URI が指定された場合同様に新しい素片識別子で識別される部分要素まで scroll するなりなんなりしようとします。 (名無しさん [sage])

[9] 値の自動的な変化: 頁内リンクの移動や location.href などの設定で URI が変化すると、 自動的に location.hash の値も更新されます。 (名無しさん [sage])

[10] >>6 より、 Gecko でも WinIE でも hash が構文的に正しい素片識別子になっていることは期待できません。 >>1 のように href から採るのが安全です。ただし >>6 にあるように WinIE ではこちらも URI として正しいことが期待できません。 (名無しさん)

[11] Bug 135309 - location.hash should not be unescaped <https://bugzilla.mozilla.org/show_bug.cgi?id=135309>

[13] Link Fingerprints (2007-07-03 07:20:54 +09:00 版) <https://people.mozilla.com/~edilee/draft-lee-uri-linkfingerprints-00.txt> (名無しさん 2007-07-24 14:22:07 +00:00)

[19] Bug 377245 &#8211; [SoC] Link Fingerprints ( 版) <https://bugzilla.mozilla.org/show_bug.cgi?id=377245>

[20] 1093611 – AnchorElement.hash should be the encoded version of the href attribute's fragment ( ( 版)) <https://bugzilla.mozilla.org/show_bug.cgi?id=1093611>

[34] Merge effective script origin into origin · whatwg/html@8a843f2 ( 版) <https://github.com/whatwg/html/commit/8a843f2169a6864a3024c4329528dccb2051d275>

[40] location.hash = "" should result in a fragment ( (annevk著, )) <https://github.com/whatwg/html/commit/c63078741df8ae8c4657dc068d5879fb3472dee6>

[32] Remove javascript URL case from <a>/<area>/Location hash setter (annevk著, ) <https://github.com/whatwg/html/commit/deea9fba916cb6e66c7dcfc57442cf25ac0441a1>

[31] Remove javascript URL special case from the API (annevk著, ) <https://github.com/whatwg/url/commit/4bf85a08da18ef367e093426abef776d59e8fb7b>