未使用JavaScript正确设置Internet Explorer cookie
我正在尝试保存/恢复回发上的滚动位置。 我的代码适用于Firefox和除Internet Explorer以外的所有主要浏览器未使用JavaScript正确设置Internet Explorer cookie,javascript,internet-explorer,cookies,scroll,Javascript,Internet Explorer,Cookies,Scroll,我正在尝试保存/恢复回发上的滚动位置。 我的代码适用于Firefox和除Internet Explorer以外的所有主要浏览器 function saveScrollPosition() { // Save the cookie if the requestor is Internet Explorer if (navigator.appName.indexOf("Microsoft") != -1) { alert("Internet Explorer
function saveScrollPosition() {
// Save the cookie if the requestor is Internet Explorer
if (navigator.appName.indexOf("Microsoft") != -1) {
alert("Internet Explorer browser has been identified...");
var scrollX, scrollY;
var strA = "KulScrollPos=";
var strB = ",";
var strC = "; path=";
// Depending on the version of Internet Explorer --- call the appropriate API
if (!document.documentElement.scrollLeft)
scrollX = document.body.scrollLeft;
else
scrollX = document.documentElement.scrollLeft;
if (!document.documentElement.scrollTop)
scrollY = document.body.scrollTop;
else
scrollY = document.documentElement.scrollTop;
alert("scrollX = " + scrollX + " and " + "scrollY = " + scrollY);
alert("strA = " + strA);
//document.cookie = "KulScrollPos="+scrollX+","+scrollY+"; path="+document.location.pathname;
document.cookie = strA.concat(scrollX, strB, scrollY, strC, document.location.pathname);
}
// Save the cookie for all other major browsers
else {
document.cookie = "KulScrollPos="+f_scrollLeft()+","+f_scrollTop()+"; path="+document.location.pathname;
}
alert("cookie = " + document.cookie)
}
function restoreScrollPosition() {
alert("Entered the restore method...");
cookieName = "KulScrollPos";
if (document.title == "KFS :: Create Purchase Log") {
resetScrollPosition();
expireCookie( cookieName );
return true;
}
else {
var matchResult = document.cookie.match(new RegExp(cookieName+"=([^;]+);?"));
if ( matchResult ) {
var coords = matchResult[1].split( ',' );
if (coords[1] != 0) {
alert("Restoring the scroll position before scrollTo... " + coords[0] + " and " + coords[1]);
window.scrollTo(coords[0],coords[1]);
parent.window.scrollTo(coords[0],coords[1]);
}
expireCookie( cookieName );
return true;
}
else {
return false;
}
}
注意我打印cookie名称的警告框
Firefox打印以下内容:
cookie = KulScrollPos=0,1946; kualiSessionId=A7807919-4719-D5B4-91D6-9CC04EEA1BA8;JSESSIONID=1F155C7FC23C48A4DAF557CA4B92D2CB
cookie = kualiSessionId=072BE31C-6AF5-6D4C-11A4-55E799790C6A; JSESSIONID=76D83E8E7EBA5F25B8A1B1990B9344E8
Internet Explorer打印以下内容:
cookie = KulScrollPos=0,1946; kualiSessionId=A7807919-4719-D5B4-91D6-9CC04EEA1BA8;JSESSIONID=1F155C7FC23C48A4DAF557CA4B92D2CB
cookie = kualiSessionId=072BE31C-6AF5-6D4C-11A4-55E799790C6A; JSESSIONID=76D83E8E7EBA5F25B8A1B1990B9344E8
请注意,字符串
KulScrollPos=01946;
正在从cookie名称中删除。这只发生在Internet Explorer中
***我尝试了另一种方法来设置字符串变量(注释掉的行),在这里我设置document.cookie=。。。该行还产生与上面显示的相同的警报输出
注意我的restorescroll位置中的ELSE块。
if(matchResult)条件总是因为这个原因而失败,因此,我调用scrollTo方法的代码永远不会被调用
呃,我把字符串串接错了吗?你不喜欢什么
真奇怪 Cookie数据不应包含逗号。您需要在写入滚动数据之前对其进行编码或转义,然后在读取时对其进行解码或取消转义
编辑:您也可以只更改分隔符;可能尝试使用管道(|)?逗号是多个cookie的有效分隔符。尝试将逗号替换为
%2C
,或escape()
整个cookie值。显然Internet Explorer不喜欢双引号中提供的cookie名称中的“=”(等号)。它在解释“=”;而不是接受它的字面意义;因此,我用单引号解决了这个问题。很明显,你必须对IE很强硬!想想看
下面的代码修复了我遇到的问题-
function saveScrollPosition() {
// Save the cookie if the requesting browser is Internet Explorer
if (navigator.appName.indexOf("Microsoft") != -1) {
// Ensure that the cookie will be saved on IE version 5/+
if (!document.documentElement.scrollLeft)
scrollX = document.body.scrollLeft;
else
scrollX = document.documentElement.scrollLeft;
if (!document.documentElement.scrollTop)
scrollY = document.body.scrollTop;
else
scrollY = document.documentElement.scrollTop;
document.cookie = 'KulScrollPos =' + scrollX+','+scrollY+';'+document.location.pathname;
}
// Save the cookie for all other major browsers
else {
document.cookie = "KulScrollPos="+f_scrollLeft()+","+f_scrollTop()+"; path="+document.location.pathname;
}
}
经验教训-
不要在cookie名称中使用“=”符号。如果需要,请使用单引号告诉IE不要解释它,而是接受它作为文字。这是一个非常敏锐的观察。我会尝试一下,让你知道它是如何工作的。。。