document.domain = document.domain做什么?

时间:2009-09-26 13:44:47

标签: javascript orbited

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

document.domain = document.domain;

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

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

4 个答案:

答案 0 :(得分:190)

我实际上写了这段代码。

当尝试执行跨子域/端口彗星时,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),然后所有内容都匹配,并且跨端口/子域框架通信可以正常工作。

答案 1 :(得分:33)

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

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

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

答案 2 :(得分:9)

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

  

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

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

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

答案 3 :(得分:6)

如果没有明确设置,document.domain会从实际网址中提取默认值。浏览器将记录document.domain是否来自URL的默认值,或者是否已明确设置。两者必须是同一域的默认值,或者两者都必须显式设置为同一域才能使其工作。如果一个是默认值并且一个是明确设置的,那么两个页面如果被读取则仍然被禁止相互交谈。

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