今天我将Firefox升级到13.0。但是我的javascript代码出了问题。
有一个网页A(www.xx.com)和网页B(webim.xx.com)。我使用 iframe 标记将B嵌入到A中。
网页A
首先将域名设为'xx.com'
<script>document.domain = 'xx.com';</script>
然后创建一个iframe来加载网页B.
<script>
var iframe = document.createElement('iframe');
document.body.insertBefore(iframe, document.body.firstChild)
iframe.src = 'http://webim.xx.com';
</script>
网页B 将域设置为“xx.com”
<script>document.domain = 'xx.com';</script>
然后我访问网页B的localStorage。
在网页A上,执行代码:
window.iframe.contentWindow.localStorage.setItem('a', 'a')
然后会出错:
Error: The operation is insecure.
在以前的版本或其他浏览器中,代码可以正常执行。
有人知道为什么吗?
这是一个错误吗?
而且..如何解决这个问题? THX。
刚才我找到了解决这个问题的方法。
我无法直接访问localStorage,但我可以调用 iframe 的功能,该功能可以调用自己网页的localStroage。
/// webpage B
<script>
document.domain = 'xx.com';
var ls = { ///< ls is short for localStorage.
setItem: function(k, v) {
return localStorage.setItem(k, v);
},
getItem: function(k) {
return localStorage.getItem(k);
},
removeItem: function(k) {
return localStorage.removeItem(k);
},
clear: function(){
return localStorage.clear();
}
}
</script>
然后我调用 ls.setItem 等来访问iframe的localStorage。
/// webpage A
<script>iframe.ls.setItem('a', 'b');</script>
即使我能解决这个问题,为什么firefox 13.0会导致这个问题?
答案 0 :(得分:4)
旧的Firefox行为是错误的,并修复了错误。根据规范,设置document.domain应该对localStorage的行为完全没有影响,所以在你的情况下你试图为不同的域设置localStorage,这是不允许的。
有关详细信息,请参阅https://bugzilla.mozilla.org/show_bug.cgi?id=495337和localStorage规范。