【发布时间】:2010-12-01 15:53:08
【问题描述】:
Orbited(Comet 服务器)的客户端 JS 组件,要求如果服务器运行在与 JS 本身不同的域或端口上,则必须执行
document.domain = document.domain;
在加载任何其他 JS 之前。 (见documentation。)
这是做什么的?它看起来像一个NOOP! (我查过了,其实是有必要的。)
【问题讨论】:
标签: javascript orbited
Orbited(Comet 服务器)的客户端 JS 组件,要求如果服务器运行在与 JS 本身不同的域或端口上,则必须执行
document.domain = document.domain;
在加载任何其他 JS 之前。 (见documentation。)
这是做什么的?它看起来像一个NOOP! (我查过了,其实是有必要的。)
【问题讨论】:
标签: javascript orbited
这段代码其实是我写的。
尝试跨子域/端口彗星时,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 ...即使它们返回相同的值。
显式设置该值表示意图与另一个子域(在同一父域下)上的脚本“合作”。
如果父页面和外部脚本都将 document.domain 显式设置为相同的值,则可以绕过同源策略限制,并且每个脚本都可以访问彼此上下文的所有(否则受限制的)对象和属性.
【讨论】:
我在这个网站上找到了以下信息:devguru。更具体地说,这是引用:
此属性设置或返回 服务器的域名 文件起源。这个默认 到服务器的域名 该文件是从中检索的,但是 可以更改为后缀(并且只有 后缀)这个名字。这允许 共享脚本属性、安全性 允许,在交付的文件之间 从不同的服务器提供他们 共享相同的域后缀。
在我看来,它允许跨站点脚本为同一域(即使子域不同)。
我想如果你不接触 document.domain,js 引擎只允许来自同一域的其他 javascripts。使用该属性,您将能够部署到其他子域,例如轨道文档状态。
【讨论】:
document.domain = document.domain 不是 NOOP。
document.domain 如果未明确设置,则从实际 URL 中提取默认值。浏览器将记录 document.domain 是否已作为 URL 的默认值或是否已明确设置。两者都必须是同一个域的默认值,或者两者都必须显式设置为同一个域才能正常工作。如果一个是默认的,一个是显式设置的,如果读取都匹配,两个页面仍然会被禁止互相交谈。
见:https://developer.mozilla.org/en-US/docs/DOM/document.domain
【讨论】: