我正在HTML页面上进行一些实验,并说如果我做了
name = "hmm";
console.log(name);
然后我将其加载到Google Chrome中,并自然地显示"hmm"
。
问题是,如果我删除第一行或将其注释掉,并重新加载页面,它将再次显示"hmm"
。如果我创建了另一个网页index2.html
,并且只打算
console.log(name);
并将浏览器中的网址从index.html
更改为index2.html
,它会再次显示"hmm"
。
所以我认为这是由于window.name
具有此值。但是,我从来不知道两个页面可以分享这样的价值。我认为window
对象应该重新开始,不应该超过......
仅在name
时发生。 foo
不会发生这种情况,但我认为即使name
也不应该继续使用。
发生了什么事?什么是跨网站(跨域?)真的不应该发生,即使它是同一个网站,应该吗?
答案 0 :(得分:1)
我从来不知道两个页面可以共享这样的值。
呀。通常情况下,他们不会。这只是因为您使用了特定的变量名if(in.hasNextLine()) {
s = in.nextLine();
if(s.length() > n) s = s.substring(0, n); // Cut the string so it is of the desired length
else {
for(int i = 0; i < n - s.length(); i++) s += " "; // Add spaces until the string is of the desired length
}
}
,并在全局范围内使用它,它与同名的name
属性相同。
window
是一个奇怪的事情,可以追溯到跨文档脚本的早期。作为一种设计,它今天没有任何意义,但它很难摆脱旧的网络行为。
当Netscape在Navigator 2.0中引入JavaScript和框架时,安全性并不是第一优先。网络是一个不同的,威胁较小的地方,出于商业原因,他们更关心的是在浏览器中添加任何和所有可能的功能,而不是设计一个连贯和安全的平台。
同源政策尚未处于起步阶段,并未被视为必不可少的基本保障措施,在设计更好,更宽松的情况下更是一种不受欢迎的阻碍。他们有一种黑名单的本能:添加功能并允许默认访问,除非它被证明是一个安全问题。
弹出窗口中的window.name
属性反映了被调用以打开它的window.name
方法的name
参数;在框架上,它反映了包含它的window.open
(或name
)元素的<frame>
属性。预计脚本将希望通过<iframe>
访问和导航相关窗口(甚至是子窗口,例如帧内的帧),甚至跨越不同的域,甚至在导航原始文档时也是如此。(*)
因此,name
的许多属性(包括window
)可以从原点外部访问,并且兼容性remain there today,包含一系列复杂的警告和限制源于无休止的浏览器安全漏洞。
(*事实证明没有多少人愿意这样做,但他们确实希望能够在不同域的两个窗口之间传递字符串数据。这些天我们只会使用{{1这是为了这个明确的目的而设计的,但当时唯一的方法就是使用对双方都是读写的唯一属性name
。这是笨拙且有限的,但有一些现有的网站做到了这一点,使得从网络平台上删除非常困难。)
Upshot:将内容放入window.postMessage
可能会产生无法预料的后果,因此请尽量将全局变量保持在绝对最小值,并避免使用name
等现有属性。