kissyteam / kissy

A Powerful Collection Of Modules
http://docs.kissyui.com
2.7k stars 863 forks source link

ie8以下,包括ie8,mvc的Router在domain改变后会无法工作 #145

Closed gykpro closed 12 years ago

gykpro commented 12 years ago

测试代码: 假设我访问www.iframetest.com

KISSY.use('mvc, node',function(S,mvc, Node){
    var $ = Node.all;
    mvc.Router.navigate('/test1');
    document.domain = "iframetest.com"
    mvc.Router.navigate('/test2')
})

第一个能工作,第二个不能工作,会提示没有权限。跟踪代码后发现的目前问题在如下两个地方: 1.2.0/build/mvc.js 501行:

return location.href.replace(/^[^#]*#?!?(.*)$/, '$1');

812行:

location.hash = "!" + path;

根源在这里: 474行

        win = window,
        location = win.location,

重新设置过domain之后 win===window(true) win.location === window.location(true) 但是location === window.location(false) 说明ie8及以下的浏览器,改变domain之后,location对象变成了另一个,而mvc中的location还持有原来的,而导致access denied

解决方法是不要缓存location到变量,而是每次重新取。

gykpro commented 12 years ago

对于用户来说,在页面一开始就把要设置的domain设好,可以解决这个问题。

yiminghe commented 12 years ago

对于 ie67 ,document.domain 只能页面一开始设置,中途设置有问题:

https://github.com/kissyteam/kissy/blob/master/src/mvc/tests/specs/router-domain-error-spec.js

gykpro commented 12 years ago

明白了。提issue时只调了ie8