2012-10-17 5 views
1

포스트 백에서 스크롤 위치를 저장/복원하려고합니다. 내 코드는 Firefox 및 Internet Explorer를 제외한 모든 주요 브라우저에서 작동합니다.JavaScript를 사용하여 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 = KulScrollPos=0,1946; kualiSessionId=A7807919-4719-D5B4-91D6-9CC04EEA1BA8;JSESSIONID=1F155C7FC23C48A4DAF557CA4B92D2CB 

Internet Explorer는 다음과 같은 인쇄 :

cookie = kualiSessionId=072BE31C-6AF5-6D4C-11A4-55E799790C6A; JSESSIONID=76D83E8E7EBA5F25B8A1B1990B9344E8 

공지 사항을 문자열이 KulScrollPos = 0,1946을; 이 쿠키 이름에서 제외됩니다. 이것은 Internet Explorer에서만 발생합니다!

*** 나는 document.cookie = ...를 설정하고있는 문자열 변수 (주석 처리 된 행)를 설정하는 또 다른 방법을 시도했습니다.이 행은 위에 표시된 것과 동일한 경고 출력도 생성했습니다.

내 RestoreScrollPosition에서 ELSE 블록을 확인하십시오. if (matchResult) 조건은 항상 이로 인해 실패합니다. 왜냐하면 내 scrollTo 메소드를 호출 한 곳에서 내 코드가 호출되지 않습니다!

나는 문자열을 잘못 연결 했습니까? IE가 IE를 좋아하지 않는 이유는 무엇입니까?

정말 이상한 행동입니다.

답변

1

분명히 Internet Explorer는 큰 따옴표 안에 제공된 쿠키 이름의 "="(등호)을 좋아하지 않습니다. 그것은 '='을 해석하고 있었다. 그것을 리터럴로 받아들이 기보다는. 따라서, 나는 작은 따옴표를 사용하여 문제를 해결했다. 분명히, 당신은 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; 
    } 
} 

교훈 - -

다음 코드는 내가 가지고 있던 문제를 해결 .... 그림 이동

는 쿠키 이름에 "="표시를 사용하지 마십시오. 필요한 경우 작은 따옴표를 사용하여 IE에 해석하지 말고 리터럴로 받아들이십시오.

0

쿠키 데이터는 쉼표를 포함 할 수 없습니다. 스크롤 데이터를 작성하기 전에 인코딩하거나 이스케이프 처리 한 다음 읽은 상태에서 디코드하거나 이스케이프 처리해야합니다.

편집 : 단락 기호 만 변경할 수도 있습니다. 어쩌면 파이프 (|)를 사용해 보시겠습니까?

+0

이것은 매우 기민한 관찰입니다. 나는 그것을 시도해보고 그것이 어떻게 작동했는지 알려줄 것입니다 ... –

+0

그건 그 일을하지 않았습니다. :( –

0

쉼표는 여러 쿠키에 대한 유효한 구분 기호입니다. 쉼표 대신 %2C 또는 전체 쿠키 값 escape()을 사용하십시오.

관련 문제