这段代码是我自己写的。
当尝试跨子域/端口使用comet时,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显式设置为相同的值,则可以绕过同源策略限制,每个脚本都可以访问彼此上下文中的所有(本来受限制的)对象和属性。
document.domain = document.domain
不是一个 NOOP。 - Crescent Freshdocument.domain
会从实际URL中获取默认值,如果没有明确设置的话。浏览器会记录document.domain
是从URL中获取的默认值还是明确设置的。两者必须都是同一个域名的默认值或都必须明确设置为相同的域名才能正常工作。如果一个是默认值,一个是明确设置的,但读取时两个匹配,则两个页面仍将被禁止彼此通信。
请参见:https://developer.mozilla.org/en-US/docs/DOM/document.domain