Orbited(Comet服务器)的客户端JS组件要求,如果服务器在与JS本身不同的域或端口上运行,则必须执行
document.domain = document.domain;
在加载任何其他JS之前。 (参见documentation。)
这是做什么的?它看起来像一个NOOP! (我已经检查过,实际上是必要的。)
答案 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