document
document.URL
返回当前文档的 URL 地址,只读.
只能在 HTML 文档中使用.
document.documentURI
返回当前文档的 URL 地址,只读.
在 DOM3 规范中定义为可写, DOM4 改为只读.
没有文档类型限制,可用于任何文档.
IE 不支持此属性
Document.documentURI - Web APIs | MDN
node.baseURI
返回当前元素所在文档的 URL 地址,只读.
可用于任何 Dom 元素.
1 | document.querySelector("div").baseURI; // http://127.0.0.1/index.html |
该属性通常等于 document.location.href,受 <base> 元素影响.
1 | <base href="htttp://example.com" /> |
IE 不支持此属性
URL documentURI baseURI location.href 的区别
通常以下四者的返回值相同,都返回字符串格式的文档地址:
- document.URL
- document.documentURI
- window.location.href
- node.baseURI
四者的区别如下:
1 只有 document 拥有 URL/location/documentURI 属性,而 baseURI 可用于任何 Dom 元素.
2 URL documentURI baseURI 三者为只读属性, 不能修改.而 location.href 可以被修改.
3 node.baseURI 受 base 元素的 href 值影响, 而另外三者不受影响.
4 关于 document.URL 和 document.documentURI 的区别.
很多文档都提到 URL 只能用于 HTML 文档, 而 document.documentURI 可用于任意文档.
但没有找到任何可正常运行的相关示例.例如下面这个例子,在 chrome 中无论是 URL 还是 documentURI 都能正常工作.
html - Some cases when document.documentURI is available but not document.URL - Stack Overflow
5 document.URL 属于比较老的 api, 作为代替应该尽量使用 window.location.href 而非 document.URL.
document.domain
获取/设置当前文档 URL 的 domain 部分.
通常情况下等于 document.location.hostname. ?
更改 document.domain 值不会更新文档的 URL.
设置 document.domain 时有规则限制.
可以更改子域的 domain 值为父域, 但不能更改父域的 domain 值为子域.
修改子域为父域,成功.
1 | document.domain; // "sub.test.t" |
修改父域为子域, 报错.
1 | document.domain; // "test.t" |
也不能修改 domain 的顶级域名.
1 | document.domain; // "test.t" |
document.domain 可用于绕过同源策略, 解除跨域操作 iframe 的限制.
如下是在 test.t/index.html 中获取 iframe(sub.test.t/foo.html) 内 window.foo 属性的例子:
test.t/index.html 的代码:
1 | <iframe src="http://sub.test.t:5500/foo.html" frameborder="0"></iframe> |
sub.test.t/foo.html 的代码:
1 | <body> |
window.location
返回 Location 对象, 包含当前文档的 URL 信息.
可以通过操作 Location 来跳转到目标的 URL.
除了 window.location 之外, 还有一个类似的属性 document.location,二者都返回相同的对象.
现代的大部分浏览器都将 document.location 指向 window.location.
1 | document.location === location; // true |
推荐使用 window.location, document.location 的存在属于历史遗留问题.
What's the difference between window.location and document.location in JavaScript? - Stack Overflow
location.href
读取/设置当前文档的 URL
1 | window.location.href = "http://example.com"; |
location.origin
返回 Location 对象的 URL origin, 只读.
1 | location.origin; // "http://test.t:5500" |
location.protocol
读取/设置 Location 对象的 URL protocol.
1 | location.protocol; // "http:" |
location.host
读取/设置 Location 对象的 URL hostname 和 port
1 | location.host // "test.t:8000" |
location.hostname
读取/设置 Location 对象的 主机名称
1 | location.hostname // "test.t:8000" |
location.port
读取/设置 Location 对象的端口,如果未显示设置端口号.
1 | location.port // "test.t:8000" |
location.pathname
读取/设置 Location 对象的 URL 路径
1 | location.pathname // "/index.html" |
location.hash
获取/设置文档 URL 的 fragment identifier(片段标识符,由 # 号开头的一组字符)
1 | document.location.href; // "http://test.t/index.html#foo" |
location.search
获取/设置文档 URL 的 query string (查询字符串,由 ? 号开头的一组字符)
1 | location.href; // "http://test.t/index.html?foo=bar" |
如果不需要支持 IE, 可以通过 URLSearchParams 来解析 query string.
1 | console.log(location.href); // "http://test.t/index.html?a=1" |
如果需要兼容 IE, 可参考: url - How can I get query string values in JavaScript? - Stack Overflow
location.assign()
跳转到对应的 URL
1 | location.assign("https://example.com"); |
location.replace()
从历史记录中删除当前页, 并跳转到对应的 URL
1 | location.assign("https://example.com"); |
location.reload()
重新加载当前的 URL
1 | location.reload(); |
部分浏览器( 如 firefox) 可传入一个布尔值来控制是否从使用浏览器缓存. 为 true 时不使用浏览器缓存, 强制从服务器获取数据.
1 | // 不使用浏览器缓存 |
不过这个参数在 chrome 上似乎是无效的.HTML5 规范文档没有提及.
该参数在 chromium 中失效的讨论:
window.location.reload(true) reloads from cache
location.ancestorOrigins
返回一个 DOMStringList 对象, 包含了从 parent browsing context (父浏览器上下文)一直到 top-level browsing context (最顶层的浏览器上下文)的 origin.
如果当前的上下文就是 top-level browsing context, 则返回一个空的 DOMStringList.
下面是一个三层结构的示例, 在 index.html 用 iframe 加载 foo.html.
再在 foo.html 中 用 iframe 加载 bar.html.
最后在 bar.html 中调用 location.ancestorOrigins.
test.t/index.html 的代码:
1 | <iframe src="http://sub.test.t/foo.html" frameborder="0"></iframe> |
sub.test.t/foo.html 的代码:
1 | <iframe src="http://bar.sub.test.t/bar.html" frameborder="0"></iframe> |
bar.sub.test.t/bar.html 的代码:
1 | <script> |