質問: Internet Explorerではdocument.URLUnencodedというプロパティがあります。 このdocument.URLUnencodedプロパティとdocument.URLプロパティの違いについて詳しく教えて欲しいです(あるいは違いが詳しく説明されているサイトなどがあれば教えて下さい)。 IE7-IE11にて試した範囲では、 * fileスキームで開いた場合にdocument.URLは`file://C:\tmp path\file.html`になるが、document.URLUnencodedでは`file:///C:/tmp%20path/file.html`になる * IE7,IE8ではdocument.URLEncodedは書き換え可能。書き換えた場合にはページが遷移する という2点がわかりました。
回答: 両者の違いを詳しく説明しているサイトが見つかりませんでしたので、自分でざっくり調べてみました。付け焼き刃なので、間違いが含まれている可能性はあります。 結論から言うと`document.URLUnencoded`はバグのまま放置されているのではないかと推測しました。 仕様 ### document.URL(以下、URL) `URL`の仕様はW3Cで定義されており、 > > **URL** of type DOMString, *readonly* > > > The absolute URI [IETF RFC 2396] of the document. > > > とあります。読み取り専用になっているのはこれを準拠しているからでしょう。 ### document.URLUnencoded(以下、URLUnencoded) `URLUnencoded`はIEの独自実装(他ブラウザでも一部対応していた気もしますが失念)ですが、質問にも記載されているMSDNの説明によれば > > Gets the URL for the document, stripped of any character encoding. > > > とあります。これは本来的にいえば`URL`のエンコードされた文字列を元に戻したものを返すためのメソッドでしょう。たとえば`%20`は(半角スペース)になります。 また、公式ではありませんが、以下の本(2006年刊)にも同様の説明があります。 > > **URLUnencoded** IE5.5 NN n/a Moz n/a Saf n/a Op n/a DOM n/a *Read-only* > > > Returns the URL of the current document, but with any URL-encoded > characters returned to their plain-language version (e.g., %20 is > converted to a space character). The returned value is the same as if > applying the JavaScript decodeURI() function to document.URL. > > > Dynamic HTML: The Definitive Reference - Danny Goodman - Google ブックス 質問内で`URLUnencoded`は値を書き換えられるとありますが、これは上記の本が正しければバグなのではないかと考えます。 IE7でのバグ IE6以前の環境を保持していないので実際に試せないのですが、IE7では`URLUnencoded`がきちんと動かないというバグ報告がサポートフォーラムにあります。 The encoded characters are not removed from the URL when you retrieve the "document.URLUnencoded" property in Windows Internet Explorer 7 これは手元のIE11でも同様で、例えば`http://localhost/in%20dex.html`などといったファイルにアクセスすると`URL`も`URLUnencoded`も同様にエンコードされたURLを返しました。 対処方法としては ``` unescape(document.URL) ``` を使用してくださいとあり、 確かにこの方法で`URLUnencoded`で期待される結果を得ることが出来ました。 尚、個人的に気になったのは国際化ドメインの扱いですが、IE7以降では対応済みなせいか、`URL`、`URLUnencoded`共に、日本語文字列はパーセントエンコーディングされずに値が返りました。 また、余談になるのですが`location.href`は`URL`と似ていますが、W3Cの仕様によれば値を書き換え可能で、ブラウザは書き換えられたURLに遷移すること、と定義されています。もし遷移目的で値を書き換える場合はこちらを用いるのが良いかもしれません。 > > that is the Location's current location. When the href attribute is set, the Location's window MUST navigate to the newly set value. > > >