什么是 window.origin?
What is window.origin?
什么是window.origin
? the usual place.
中似乎没有记录
它看起来可能与 window.location.origin
非常相似 - 例如,在 Stack Overflow 上,return
https://whosebug.com
但在 iframe
中,它们是不同的:
console.log(window.location.origin);
console.log(window.origin);
https://stacksnippets.net
null
嵌入的代码段位于 iframe
内,没有 allow-same-origin
。如果您更改 iframe,例如,如果您编辑 Stack Overflow 的 HTML 并手动添加属性:
<iframe name="313b857b-943a-7ffd-4663-3d9060cf4cb6" sandbox="allow-same-origin allow-forms allow-modals allow-scripts" class="snippet-box-edit" frameborder="0" style="">
^^^^^^^^^^^^^^^^^^
然后 运行 片段,您将得到:
https://stacksnippets.net
https://stacksnippets.net
在其他 <iframe>
网站上也出现了同样的行为。
Google does not appear to have any authoritative links on the subject. Searching for the exact phrase + Javascript 给出了很多与 iframe
s 和 postMessage
有关的结果,但没有准确描述什么 window.origin
实际上是.
从子 iframe
调用 postMessage
似乎导致父 window 收到一条消息,其中 origin
属性 匹配 window.origin
的子帧——没有allow-same-origin
就是null
,否则看起来和子帧的window.location.origin
一样。
以上是我的想法我是通过猜测和验证得出的,但我还不确定。我很感激 confirmation/explanation,最好是 link 给权威来源。
我认为它没有记录在案,因为两者相同,差别不大,
大多数情况下,您选择使用哪个选项并不重要。但是,在某些情况下,其中一个优于另一个,例如:
- 如果在 iframe 中设置新的 URL 或另一个已经与当前 window 不同来源的 window(例如,iframe 具有与其加载的文档不同的域,并且您想更改 iframe 的 URL)将使用 window。设置新 URL 的位置。这是因为 location.href 从不同来源(域)调用时是只读的。
- 如果在 JavaScript 中严格使用 use 如果使用 window 可能会导致异常。 location 因为你本质上是将一个字符串分配给一个对象,所以在这里最好使用完整的 window.location.href.
参考this question。
WindowOrWorkerGlobal.origin returns the origin of the environment, Location.originreturn是环境URL的起源。
不幸的是,Stack-Snippets 源自 null 的帧会导致混淆示例...
冒着解释 the specs themselves 的风险,假设我们在 https://example.com
上,然后从那里创建一个没有 src
属性的新
var frame = document.createElement("iframe")
frame.onload = function() {
var frameWin = frame.contentWindow;
console.log(frameWin.location.href); // "about:blank"
console.log(frameWin.location.origin) // "null"
console.log(frameWin.origin) // "https://example.com"
}
document.body.appendChild(frame);
我们frameWin
的location
是"about:blank"
,它的location.origin
是"null"
,因为"about:blank"
是一个opaque origin.
但是,框架的 Window frameWin
将其自己的 origin
设置为父 Window ("https://example.com"
) 之一,它是在frameWin
的 浏览上下文 已初始化。
如果您想深入了解规范,请参考上一个示例的相关步骤:
- 在
frame
创建时:
https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-iframe-element:about:blank
If the element has no src
attribute specified, or its value is the empty string, let url
be the URL "about:blank".
- 为
frame
创建新的 浏览上下文 时
https://html.spec.whatwg.org/multipage/browsers.html#creating-browsing-contexts:about:blank
If invocationOrigin is not null, and url is about:blank, then return invocationOrigin.
所以这里已经确定新的浏览上下文的origin
是invocationOrigin
,即[=]的origin
67=]确实创建了 frame
的浏览上下文 ,而 location
使用的 url
是 "about:blank"
。
现在 StackSnippets 沙盒框架的情况有点特殊,因为它们确实有一个 src
,因此有一个 tuple-origin url ,但由于它们的 sandbox
属性使它们的 origin 不透明,它们的行为将与前面示例中公开的相反,使 self.origin
return "null"
和 location
return iframe 的 src
的 URL.
位置描述了当前页面的URL。它可以通过 window 获得。位置 属性.
<a id='foo' href='#bar'>Go to #bar</a>
<div style='height: 1000px'></div>
<a id='bar' href='#foo'>Go to #foo</a>
<script>
var printHash = function() {
console.log("'" + window.location.hash + "'");
};
// Print initial hash
printHash();
window.onhashchange = printHash;
</script>`enter code here`
更多信息:
Internet Explorer 无法访问 window.location.origin,这很糟糕,因为它是一个非常方便的变量,但我们可以通过相当直接的检查使其工作,因为我们访问 .origin;
if (!window.location.origin) {
window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
}
好有趣的问题!
我们可以从一些调查开始 - 让我们看看 window
的输出
console.log(window)
那个文件很大... Window 接口表示一个 window 包含一个 DOM 文档;文档 属性 指向 window 中加载的 DOM 文档,并描述了 Window 和 WorkerGlobalScope 的几个共同特征。
但是你想看一个非常特别的 属性 window.origin
.
window.origin
如您所见,对于堆栈溢出(代码片段)来说,这非常无聊,为 window 返回的 json obj 带来:
"origin": "null"
此响应是 window 告诉我们来源不同并且我们不允许 window 具有相同来源的方式。 iframe
很常见的效果,你自己扣!
您还看到 window.location
没那么无聊...因为它包含更多数据,因为 Location 接口表示它链接到的对象的位置 (URL)很酷的是,对它所做的任何更改都会反映在它相关的对象上。所以这就是为什么我们在这里没有得到空值。
window.location...
"location": {
"ancestorOrigins": {
"0": "https://whosebug.com",
"length": 1,
"item": function item() {
[native code
]
},
"contains": function contains() {
[native code
]
}
},
"origin": "https://stacksnippets.net",
...
}
什么是window.origin
? the usual place.
它看起来可能与 window.location.origin
非常相似 - 例如,在 Stack Overflow 上,return
https://whosebug.com
但在 iframe
中,它们是不同的:
console.log(window.location.origin);
console.log(window.origin);
https://stacksnippets.net null
嵌入的代码段位于 iframe
内,没有 allow-same-origin
。如果您更改 iframe,例如,如果您编辑 Stack Overflow 的 HTML 并手动添加属性:
<iframe name="313b857b-943a-7ffd-4663-3d9060cf4cb6" sandbox="allow-same-origin allow-forms allow-modals allow-scripts" class="snippet-box-edit" frameborder="0" style="">
^^^^^^^^^^^^^^^^^^
然后 运行 片段,您将得到:
https://stacksnippets.net https://stacksnippets.net
在其他 <iframe>
网站上也出现了同样的行为。
Google does not appear to have any authoritative links on the subject. Searching for the exact phrase + Javascript 给出了很多与 iframe
s 和 postMessage
有关的结果,但没有准确描述什么 window.origin
实际上是.
从子 iframe
调用 postMessage
似乎导致父 window 收到一条消息,其中 origin
属性 匹配 window.origin
的子帧——没有allow-same-origin
就是null
,否则看起来和子帧的window.location.origin
一样。
以上是我的想法我是通过猜测和验证得出的,但我还不确定。我很感激 confirmation/explanation,最好是 link 给权威来源。
我认为它没有记录在案,因为两者相同,差别不大, 大多数情况下,您选择使用哪个选项并不重要。但是,在某些情况下,其中一个优于另一个,例如:
- 如果在 iframe 中设置新的 URL 或另一个已经与当前 window 不同来源的 window(例如,iframe 具有与其加载的文档不同的域,并且您想更改 iframe 的 URL)将使用 window。设置新 URL 的位置。这是因为 location.href 从不同来源(域)调用时是只读的。
- 如果在 JavaScript 中严格使用 use 如果使用 window 可能会导致异常。 location 因为你本质上是将一个字符串分配给一个对象,所以在这里最好使用完整的 window.location.href.
参考this question。
WindowOrWorkerGlobal.origin returns the origin of the environment, Location.originreturn是环境URL的起源。
不幸的是,Stack-Snippets 源自 null 的帧会导致混淆示例...
冒着解释 the specs themselves 的风险,假设我们在 https://example.com
上,然后从那里创建一个没有 src
属性的新
var frame = document.createElement("iframe")
frame.onload = function() {
var frameWin = frame.contentWindow;
console.log(frameWin.location.href); // "about:blank"
console.log(frameWin.location.origin) // "null"
console.log(frameWin.origin) // "https://example.com"
}
document.body.appendChild(frame);
我们frameWin
的location
是"about:blank"
,它的location.origin
是"null"
,因为"about:blank"
是一个opaque origin.
但是,框架的 Window frameWin
将其自己的 origin
设置为父 Window ("https://example.com"
) 之一,它是在frameWin
的 浏览上下文 已初始化。
如果您想深入了解规范,请参考上一个示例的相关步骤:
- 在
frame
创建时: https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-iframe-element:about:blank
If the element has no
src
attribute specified, or its value is the empty string, leturl
be the URL "about:blank".
- 为
frame
创建新的 浏览上下文 时 https://html.spec.whatwg.org/multipage/browsers.html#creating-browsing-contexts:about:blank
If invocationOrigin is not null, and url is about:blank, then return invocationOrigin.
所以这里已经确定新的浏览上下文的origin
是invocationOrigin
,即[=]的origin
67=]确实创建了 frame
的浏览上下文 ,而 location
使用的 url
是 "about:blank"
。
现在 StackSnippets 沙盒框架的情况有点特殊,因为它们确实有一个 src
,因此有一个 tuple-origin url ,但由于它们的 sandbox
属性使它们的 origin 不透明,它们的行为将与前面示例中公开的相反,使 self.origin
return "null"
和 location
return iframe 的 src
的 URL.
位置描述了当前页面的URL。它可以通过 window 获得。位置 属性.
<a id='foo' href='#bar'>Go to #bar</a>
<div style='height: 1000px'></div>
<a id='bar' href='#foo'>Go to #foo</a>
<script>
var printHash = function() {
console.log("'" + window.location.hash + "'");
};
// Print initial hash
printHash();
window.onhashchange = printHash;
</script>`enter code here`
更多信息: Internet Explorer 无法访问 window.location.origin,这很糟糕,因为它是一个非常方便的变量,但我们可以通过相当直接的检查使其工作,因为我们访问 .origin;
if (!window.location.origin) {
window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
}
好有趣的问题!
我们可以从一些调查开始 - 让我们看看 window
console.log(window)
那个文件很大... Window 接口表示一个 window 包含一个 DOM 文档;文档 属性 指向 window 中加载的 DOM 文档,并描述了 Window 和 WorkerGlobalScope 的几个共同特征。
但是你想看一个非常特别的 属性 window.origin
.
window.origin 如您所见,对于堆栈溢出(代码片段)来说,这非常无聊,为 window 返回的 json obj 带来:
"origin": "null"
此响应是 window 告诉我们来源不同并且我们不允许 window 具有相同来源的方式。 iframe
很常见的效果,你自己扣!
您还看到 window.location
没那么无聊...因为它包含更多数据,因为 Location 接口表示它链接到的对象的位置 (URL)很酷的是,对它所做的任何更改都会反映在它相关的对象上。所以这就是为什么我们在这里没有得到空值。
window.location...
"location": {
"ancestorOrigins": {
"0": "https://whosebug.com",
"length": 1,
"item": function item() {
[native code
]
},
"contains": function contains() {
[native code
]
}
},
"origin": "https://stacksnippets.net",
...
}