什么document.domain = document.domain做什么?

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

document.domain = document.domain; 

之前任何其他JS加载。 (请参阅文档 。)

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

我其实写了这个代码。

当尝试做跨子域/端口彗星时,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) ,然后一切匹配,跨端口/子域框架通信工作。

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

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

如果BOTH父页面和外部脚本明确地将document.domain设置为相同的值,则可以绕过同源策略限制,并且每个脚本可以访问所有(另外限制的)对象和对方的上下文的属性。

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

该属性设置或返回文档所源自的服务器的域名。 默认情况下,该文档被重新取回的服务器的域名,但可以更改为后缀名(只有后缀)。 这允许共享脚本属性,安全性允许从不同服务器提供的文档之间提供它们共享相同的域后缀。

在我看来,它允许跨站点脚本相同的域名(即使子域是不同的)。

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

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

请参阅: https : //developer.mozilla.org/en-US/docs/DOM/document.domain