4

를 통해 설정하면 실행에서 window.onhashchange 방지 JavaScript를 통해 :해시가 나는 사용자가 페이지의 해시가 변경 될 때 코드를 실행하기 위해 window.onhashchange 기능을 사용하여 자바 스크립트

window.location.hash = "#abc"; 

JavaScript를 통해 해시를 설정할 때 onhashchange 이벤트가 발생하지 않도록하고 싶습니다.

지금까지 시도하는 것 : 이벤트가 지연 해고, 그래서 코드가 먼저 해시를 설정하기 때문에 작동하지 않았다

var currently_setting_hash = false; 

window.onhashchange = function() { 
    if (currently_setting_hash) 
    return; 
//... 
} 

currently_setting_hash = true; 
window.location.hash = "#abc"; 
currently_setting_hash = false; 

후 다음 허위로 "currently_setting_hash"로 설정 onhashchange 이벤트를 실행하십시오.

달성 방법에 대한 아이디어가 있으십니까? 또는 해시가 사용자 또는 JavaScript를 통해 설정되었는지 감지하는 방법이 있습니까?

당신은 이벤트 처리기 자체에서 변수를 재설정 할 수

답변

7

:

var currently_setting_hash = false; 

$(window).on("hashchange", function() { 
    if (currently_setting_hash) { 
     currently_setting_hash = false; 
     return; 
    } 

    currently_setting_hash = false; 
    //... 
}); 

currently_setting_hash = true; 
window.location.hash = "#abc"; 
+0

나는 아이디어가 마음에 든다. 즉시 테스트 할 것이다. – Preli

+0

그것은 작동한다. 너는 나의 영웅이야! – Preli

3

당신은 그냥 평범한 자바 스크립트를 사용하려면 : 이벤트가 지연되기 때문에

var currently_setting_hash = false; 

    window.onhashchange = function() { 
     if (currently_setting_hash){ 
      currently_setting_hash = false; 
      return; 
     //... 
     } 
     alert('outside the script'); 
    } 
    function changeHash(hash){ 
     currently_setting_hash = true; 
     window.location.hash = hash; 
    } 
4

을 가능성이있다 이벤트가 예상보다 다른 순서로 발생합니다 (예 : 사용자가 코드가 수행되기 직전 또는 직후에 다른 방법으로 URL을 변경한다고 생각한 경우). 사건이 당신 것임을 가정하여 일관성을 유지하지 않는 것이 중요합니다. 그러므로 내가 제안 (코드 아담 Bubela의에 따라)가 :

var expectedHash; 

window.onhashchange = function() { 
    if (window.location.hash === expectedHash) { 
     return; 
    } 
    expectedHash = window.location.hash; 
    // ... do actual reaction to change here ... 
} 

function changeHash(hash) { 
    hash = canonicalizeHashValue(hash); 
    expectedHash = hash; 
    window.location.hash = hash; 
} 

// Helper - return the version of the URL that the browser is expected to 
// so that the equality test is accurate. 
function canonicalizeHashValue(value) { 
    // Borrowing an A element's ability to resolve/parse URLs. 
    var tmp = document.createElement('a'); 
    tmp.href = ""; 
    tmp.hash = value; 
    return tmp.hash; 
} 

변경하면를 기대 값 경우에만 변경 핸들러가 표시되지 않습니다이 코드. (onhashchange의 할당은 해시가 일시적으로 다른 값으로 바뀌면 핸들러도 실행되도록합니다.

세 번째 도우미 함수 canonicalizeHashValue은 비표준 값을 지정하고 있습니다. changeHash('#foo') 대신 changeHash('foo')입니다.

+0

'window.location.hash'는 선행 "#"을 포함하지만'expectedHash' 변수는 그렇지 않습니다. 그러므로'expectedHash'는'expectedHash = "#"+ hash'처럼 설정되어서는 안됩니다? – primehalo

+0

@primehalo : 왜'expectedHash' 변수에'# '가 포함되어 있지 않다고 생각합니까? –

+0

'window.location.hash'를 설정할 때 해시 기호를 포함 할 필요가 없습니다 (w3schools는 실제로 포함되어서는 안된다고 말합니다). 그래서 확인하는 것이 가장 좋을 수도 있고 존재하지 않을 수도 있습니다. – primehalo

0

글쎄, 이벤트가 지연되기 때문에 해시를 변경하면 (여러 이유로) 여러 번 이벤트가 연속적으로 발생합니다. 이 경우 해시가 변경 될 때마다 정수를 증가시켜야합니다.

관련 문제