2011-09-23 66 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

相關問題