2011-09-23 70 views
1

我想在浏览器对页面上较低的各种资源发出请求之前设置一些cookie(通过javascript)。在镀铬/火狐,但是,不是IE以下工作:在IE中的后续请求之前设置cookie

[some_page.html]

<!doctype html> 
<head> 
<script> 
    var hash=new Date(); 
    document.cookie='hash=' + hash + ';'; 
    console.log("From page: " + hash); 
</script> 
<script src="/test_cookie.php"></script> 
</head> 
<body></body> 
</html> 

[test_cookie.php]

console.log('From script: <?=$_COOKIE['hash']?>'); 

当观看some_page.html,我看到以下在控制台(在Chrome/Firefox中):

"From page: 1316757967982" 
"From script: 1316757967982" 

是否有任何技巧可以让它在IE中工作?像在test_cookie.php脚本标记上设置defer一样,或者沿着这些行设置其他内容......?

谢谢!

回答

2

您可以动态生成第二个脚本标记并将其注入到页面中,因此在您设置cookie之前无法启动它。然后,如果您要动态生成脚本标记,那么在test_cookie.php src URL的末尾添加“?hash = 1316757967982”实际上可能会更好,因此可以保证您的服务器获得散列值(来自URL而不是cookie)。然后,你不必依赖cookie和脚本时间。

这里是如何动态添加脚本标签:

function addScriptTag(url) { 
    var s = document.createElement(’script’); 
    s.type=’text/javascript’; 
    s.src= url; 
    document.getElementsByTagName(’head’)[0].appendChild(s); 
} 

addScriptTag("/test_cookie.php?hash=" + new Date()); 

有一个与它不会启动的同时加载多个脚本的浏览器没有合同的话,只有这将静态执行合同按顺序定义脚本,所以我不认为你现有的方法是有保证的。并行加载多个脚本很容易成为所需的浏览器加速选项。

+0

是的,您可能没有指定合约是正确的,但是,在继续解析DOM的其余部分之前,所有当前浏览器(FF/IE/WK)都将解析/执行内联脚本。参见:http://bit.ly/q4Ku19 http://bit.ly/pkcCK3。 此外,动态添加脚本不会保留执行顺序,对吧?对不起,我应该指定,作为一个需求... –

+1

通过契约,页面中的所有代码必须按顺序执行,并且页面之前的DOM元素在执行时必须存在。但是,代码不必以任何特定的顺序从服务器获取,而这正是您想要依赖的顺序。所以,我不认为你可以依靠这一点。您正确地认为动态插入的脚本标签现在是异步加载的,因此不会加载/执行订单。 – jfriend00

+0

如果你想要更多的选择来解决你的问题,你可能需要解释你真正想在这里做什么。为什么在加载脚本之前需要获取散列值到cookie中?可能有不同的方法来解决这个问题。 – jfriend00

相关问题