3177


Internet Explorerではdocument.URLUnencodedというプロパティがあります。  
<http://msdn.microsoft.com/en-us/library/ie/ms534709%28v=vs.85%29.aspx>

この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点がわかりました。


CC BY-SA 3.0
2015-01-06T05:24:37.270
3166
2015-01-06T08:07:16.083
2015-01-06T05:53:19.683
3313
2353
question
javascript internet-explorer
IEのdocument.URLUnencodedとは何者なのか


両者の違いを詳しく説明しているサイトが見つかりませんでしたので、自分でざっくり調べてみました。付け焼き刃なので、間違いが含まれている可能性はあります。

結論から言うと`document.URLUnencoded`はバグのまま放置されているのではないかと推測しました。

## 仕様

### document.URL(以下、URL)

`URL`の仕様は[W3Cで定義](http://www.w3.org/TR/DOM-
Level-2-HTML/html.html#ID-46183437)されており、

> **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
ブックス](https://books.google.co.jp/books?id=GEQlVcVf_zkC&pg=PA495&lpg=PA495&dq=urlunencoded+book&source=bl&ots=iur_BIRUtJ&sig=QuN8gJU1Lr03fJlZdwUUOsGv5Jk&hl=ja&sa=X&ei=8oqrVMqVDo338QW60IHQDg&ved=0CB0Q6AEwAA#v=onepage&q=urlunencoded%20book&f=false)

質問内で`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](http://support2.microsoft.com/kb/927846/en-us)

これは手元のIE11でも同様で、例えば`http://localhost/in%20dex.html`などといったファイルにアクセスすると`URL`も`URLUnencoded`も同様にエンコードされたURLを返しました。

対処方法としては

[code]

    unescape(document.URL)
    
[/code]

を使用してくださいとあり、 確かにこの方法で`URLUnencoded`で期待される結果を得ることが出来ました。

* * *

尚、個人的に気になったのは国際化ドメインの扱いですが、IE7以降では対応済みなせいか、`URL`、`URLUnencoded`共に、日本語文字列はパーセントエンコーディングされずに値が返りました。

また、余談になるのですが`location.href`は`URL`と似ていますが、[W3Cの仕様](http://www.w3.org/TR/Window/#location-
attributes)によれば値を書き換え可能で、ブラウザは書き換えられた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.


CC BY-SA 3.0
2015-01-06T07:55:43.523
3177
2015-01-06T08:07:16.083
2015-01-06T08:07:16.083
3313
3313
3166
answer