document.domain = document.domain 有啥作用?

Posted

技术标签:

【中文标题】document.domain = document.domain 有啥作用?【英文标题】:What does document.domain = document.domain do?document.domain = document.domain 有什么作用? 【发布时间】:2010-12-01 15:53:08 【问题描述】:

Orbited(Comet 服务器)的客户端 JS 组件,要求如果服务器运行在与 JS 本身不同的域或端口上,则必须执行

document.domain = document.domain;

在加载任何其他 JS 之前。 (见documentation。)

这是做什么的?它看起来像一个NOOP! (我查过了,其实是有必要的。)

【问题讨论】:

【参考方案1】:

document.domain 如果未明确设置,则从实际 URL 中提取默认值。浏览器将记录 document.domain 是否已作为 URL 的默认值或是否已明确设置。两者都必须是同一个域的默认值,或者两者都必须显式设置为同一个域才能正常工作。如果一个是默认的,一个是显式设置的,如果读取都匹配,两个页面仍然会被禁止互相交谈。

见:https://developer.mozilla.org/en-US/docs/DOM/document.domain

【讨论】:

【参考方案2】:

这段代码其实是我写的。

尝试跨子域/端口彗星时,iframe 需要与父框架具有相同的document.domain 值。不幸的是,浏览器在内部存储了原始document.domain 值的域名和端口。但是 javascript 中的 getter 和 setter 对端口一无所知。所以问题是这样的:如果顶框document.domain('example.com', 80),底框是('comet.example.com', 80),那么如何让底框也是('example.com', 80)

您不能,因为更改主机名部分必然会导致端口设置为null,因此您可以做的最好的事情是在底部框架中设置('example.com', null)。所以顶部框架也需要设置为该值,设置document.domain=document.domain 就是这样做的。它将浏览器中的内部表示从('example.com', 80) 更改为('example.com', null),然后一切匹配,跨端口/子域帧通信正常工作。

【讨论】:

不幸的是,此解决方案对我不起作用(有关详细信息,请参阅***.com/questions/7796767/…)。将“document.domain=document.domain”添加到所有框架不会改变 Chrome 的行为。有什么想法吗? 另外,我发现如果我为我的 js 设置延迟,我至少会得到两个框架的看起来有效的 URL。但是,一个框架仍然无法访问另一个框架。 在 MDN 上还有另一种解释奇怪的“隐藏”端口是如何工作的:developer.mozilla.org/en/Same_origin_policy_for_JavaScript 啊,所以你是这个令人发指的代码的罪魁祸首。多亏了这行,在它运行(和 document.domain 设置)之后,任何动态创建的 iframe 都被设置为跨域,因此新创建的 iframe 不能再被访问。 :// @mjs yes : 端口号由浏览器单独保存。对 setter 的任何调用,包括 document.domain = document.domain 都会导致端口号被 null 覆盖。因此,仅在第一个设置 document.domain = "company.com" 无法使 company.com:8080 与 company.com 对话。它必须在两者中设置,以便端口号都是空的。【参考方案3】:

浏览器区分 (a) 未明确设置时的 document.domain 和 (b) 显式设置时的 document.domain ...即使它们返回相同的值。

明确设置该值表示意图与另一个子域(在同一父域下)上的脚本“合作”。

如果父页面和外部脚本都将 document.domain 显式设置为相同的值,则可以绕过同源策略限制,并且每个脚本都可以访问彼此上下文的所有(否则受限制的)对象和属性.

【讨论】:

【参考方案4】:

我在这个网站上找到了以下信息:devguru。更具体地说,这是引用:

此属性设置或返回 服务器的域名 文件起源。这个默认 到服务器的域名 该文件是从中检索的,但是 可以更改为后缀(并且只有 后缀)这个名字。这允许 共享脚本属性、安全性 允许,在交付的文件之间 从不同的服务器提供他们 共享相同的域后缀。

在我看来,它允许跨站点脚本为同一域(即使子域不同)。

我想如果你不接触 document.domain,js 引擎只允许来自同一域的其他 javascripts。使用该属性,您将能够部署到其他子域,例如轨道文档状态。

【讨论】:

这并不能解释为什么document.domain = document.domain 不是 NOOP。 只是一个疯狂的猜测,但就像我说的那样,我猜该属性只有在设置为一个值时才会触发。

以上是关于document.domain = document.domain 有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

document.domain

jQuery - 如果存在,获取 document.domain 的值

IE9:设置 document.domain 时访问被拒绝

设置document.domain实现js跨域注意点

document.domain 可以包含端口号吗? [复制]

document.domain 可以包含端口号吗? [复制]