2014-07-06 3 views
3

크롬 및 팝 스테이트 이벤트와 관련된 주제가 많지만 크롬을 버전 35로 업그레이드 한 후 새로운 항목을 발견했습니다. 뒤로 버튼을 클릭하면 Chrome 35이 팝업 상태가됩니다.

는 경우입니다 : 당신은 카테고리, 페이지 등을 선택할 내가 범주와 필터 목록 페이지를 가지고

, 후 내용이 아약스를 통해 다시로드하고 모든 것이 잘 작동 역사 API에 의해 처리됩니다.

그러나 목록에있는 항목의 세부 정보 페이지로 이동하면 전체 페이지가 다시로드되고 브라우저의 뒤로 버튼이 눌러집니다. 마지막으로 항목을 클릭 한 위치에 목록 페이지가 표시 될 수 있지만 팝업 상태가 트리거됩니다 (그리고 여기에서 크롬 popstate에 대해 초기 페이지로드시 34 버전의 popstate가 init에서 더 이상 트리거되지 않음), 전체 페이지를 처리하기 위해 이전에 언급 한 코드로 인해 전체 페이지가 다시로드됩니다. 사용자가 내 목록 페이지에 세부 사항 페이지에서 돌아온 후

방법이 이벤트가 트리거되는 것을 감지 :

그래서 문제는 우리가 버튼을 다시 누른 후 크롬 35 popstate 이벤트를 트리거, 내 질문은이다 이걸 다시로드하지 마십시오.

문서 객체 리퍼러 등을 사용해 보았습니다. 처음 솔루션으로 보일 때 항상 작동하지 않는 경우가있었습니다.

답변

0

이 문제가 발생했습니다. 내 솔루션은 약간의 해킹이지만 꽤 잘 작동하는 것 같습니다. 나는 onpopstate 핸들러를 설정하기 전에 150ms 동안 기다리는 것이 Chrome이 초기 "onpopstate"핸들러를 실행하기를 기다릴만큼 충분하다는 것을 알았습니다.이 핸들러는 "이점"에 사용할 수 있습니다. 예를 들어, 초기 onpopstate가 실행 된 경우 감지 :

// wait for page to load 
$(function() { 
    var no_initial_onpopstate = true; 
    var enabled = true; 

    window.onpopstate = function() { 
    if(!enabled) return; 
    console.log("detected initial onpopstate"); 
    no_initial_onpopstate = false; 
    } 

    setTimeout(function() { 
    enabled = false; 
    console.log("No initial onpopstate: ", no_initial_onpopstate); 

    // no_initial_onpopstate indicates if the browser emitted an initial 
    // onpopstate event. Do with that information what you will 

    // 150ms delay seems to be the "magic number" to wait for Chrome to 
    // run all of its initial onpopstate handlers (in my tests on localhost, at least) 
    }, 150); 
}); 

그래서,이에서 나는 브라우저의 DOM ready 이벤트의 150ms의 후`onpopstate '콜백을 설정하는 크롬의 초기 onpopstate을 건너 뛸 것이라고 수집합니다.

관련 문제