Orbited(Comet服务器)的客户端JS组件要求,如果服务器在JS本身的不同域或端口上运行,则必须执行
document.domain = document.domain;
在加载任何其他JS之前。(请参阅文档。)
这是做什么的?看起来像个NOOP!(我已经检查过了,实际上这是必要的。)
Answers:
我实际上写了这段代码。
尝试做跨子域/端口彗星时,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)
,然后一切都匹配了,跨端口/子域框架通信正常进行。
我在此站点上找到了以下信息:devguru。更具体地说,这是报价:
此属性设置或返回文档所源自的服务器的域名。该默认值是获取文档的服务器的域名,但可以更改为该名称的后缀(仅后缀)。这允许在不同服务器提供的文档共享相同的域后缀的情况下,在不同服务器之间共享脚本属性和安全性。
在我看来,它允许跨站点脚本编写相同的域(即使子域不同)。
我想如果您不触摸document.domain,则js引擎仅允许来自相同域的其他javascript。有了该属性,您将能够部署到其他子域,例如轨道文档状态。
document.domain = document.domain
是不是一个空操作。
该document.domain
如果没有明确设定是直接从实际的URL默认。浏览器将记录document.domain
URL的默认设置或是否已明确设置。两者都必须是同一域的默认值,或者两者都必须显式设置为同一域才能起作用。如果默认设置为一个,并且显式设置为一个,则两个都匹配(如果已读取),则仍将禁止两个页面相互交谈。
请参阅:https://developer.mozilla.org/en-US/docs/DOM/document.domain