jQuery-해시 변경 이벤트


86

나는 사용하고있다 :

$(window).bind( 'hashchange', function(e) { });

함수를 해시 변경 이벤트에 바인딩합니다. 이것은 IE8, Firefox 및 Chrome에서 작동하는 것처럼 보이지만 Safari에서는 작동하지 않으며 이전 버전의 IE에서는 작동하지 않는다고 가정합니다. 이러한 브라우저의 경우 해시와 hashchange이벤트 를 사용하는 JavaScript 코드를 비활성화하고 싶습니다 .

브라우저가 hashchange이벤트를 지원하는지 감지 할 수있는 jQuery를 사용하는 방법이 있습니까? 어쩌면 뭔가 jQuery.support...


4
jQuery 해시 변경 이벤트-jQuery 플러그인은 IE8에서도 완벽하게 작동합니다. + 그것은 :)을 사용하는 것은 매우 쉽습니다
enloz

답변:


69

다음을 통해 브라우저가 이벤트를 지원하는지 감지 할 수 있습니다.

if ("onhashchange" in window) {
  //...
}

또한보십시오:


그것과 빠른 응답에 감사드립니다.
Ian Herbert

19
IE7 호환 모드에서 실행되는 IE8은 이벤트가 지원되지 않더라도 창에서 'onhashchange'에 대해 true를보고합니다.-from jQuery Mobile
Vikas

35

2017 년 현재 업데이트 된 답변은 누구나 필요할 경우 onhashchange모든 주요 브라우저에서 잘 지원 된다는 것 입니다. 자세한 내용은 caniuse 를 참조하십시오. jQuery와 함께 사용하려면 플러그인이 필요하지 않습니다.

$( window ).on( 'hashchange', function( e ) {
    console.log( 'hash changed' );
} );

때때로 나는 hashbang URL이 여전히 사용되는 레거시 시스템을 발견하고 이것은 도움이됩니다. 새로운 것을 구축하고 해시 링크를 사용하는 경우 HTML5 pushState API를 대신 사용하는 것이 좋습니다.


2
이것은 잘 작동 window.location.hash하며 현재 해시에 액세스하는 데 사용 합니다.
Daniel Dewhurst


18

문제에 대한 다른 접근 방식 ...

hashchange 이벤트를 메서드에 바인딩하는 세 가지 방법이 있습니다.

<script>
    window.onhashchange = doThisWhenTheHashChanges;
</script>

또는

<script>
    window.addEventListener("hashchange", doThisWhenTheHashChanges, false);
</script>

또는

<body onhashchange="doThisWhenTheHashChanges();">

이들은 모두 Win 7의 IE 9, FF 5, Safari 5 및 Chrome 12에서 작동합니다.


8

Mozilla 공식 사이트를 사용해보세요 : https://developer.mozilla.org/en/DOM/window.onhashchange

다음과 같이 인용 :

if ("onhashchange" in window) {
    alert("The browser supports the hashchange event!");
}

function locationHashChanged() {
    if (location.hash === "#somecoolfeature") {
        somecoolfeature();
    }
}

window.onhashchange = locationHashChanged;

3

방금 같은 문제가 발생했습니다 (IE7에서 해시 변경 이벤트가 없음). 내 목적에 적합한 해결 방법은 해시 변경 링크의 클릭 이벤트를 바인딩하는 것이 었습니다.

<a class='hash-changer' href='#foo'>Foo</a>

<script type='text/javascript'>

if (("onhashchange" in window) && !($.browser.msie)) { 

    //modern browsers 
    $(window).bind('hashchange', function() {
        var hash = window.location.hash.replace(/^#/,'');
        //do whatever you need with the hash
    });

} else {

    //IE and browsers that don't support hashchange
    $('a.hash-changer').bind('click', function() {
        var hash = $(this).attr('href').replace(/^#/,'');
        //do whatever you need with the hash
    });

}

</script>

1
당신이 사용할 수있는 $('a[href^="#"]')링크 얻을 href클래스 추가에 대한 필요성을 피하고, 해시로 시작들
tobymackenzie

2

IE 7과 IE 9의 경우 (윈도우의 "onhashchange")에 대해 설명이 참이면 window.onhashchange는 실행되지 않으므로 해시를 저장하고 변경 여부에 관계없이 100 밀리 초마다 확인하는 것이 좋습니다. 모든 버전의 IE.

    if (("onhashchange" in window) && !($.browser.msie)) { 
         window.onhashchange = function () { 
              alert(window.location.hash);             
         }            
         // Or $(window).bind( 'hashchange',function(e) {  
         //       alert(window.location.hash); 
         //   });              
    }
    else { 
        var prevHash = window.location.hash;
        window.setInterval(function () {
           if (window.location.hash != prevHash) {
              prevHash = window.location.hash;
              alert(window.location.hash);
           }
        }, 100);
    }

2
브라우저가 처리하기에 너무 많지 않습니까? 100ms마다 해시 변경을 폴링하려면?
adardesign

5
당신의 샘플 코드는 내가 작업 관리자를 열고 프로세스를 죽일 때까지 내 IE8 경고를 만들었습니다 :)
enloz

오타가 있기 때문입니다. "storedHash"대신 "prevHash"를 사용하면 작동합니다. 그는 기본적으로 선언 된 것과 다른 변수 이름을 사용했습니다.
Nick

2

해시 이벤트 대신 다른 방법을 사용하고 popstate를 듣는 것은 어떻습니까?

window.addEventListener('popstate', function(event)
{
    if(window.location.hash) {
            var hash = window.location.hash;
            console.log(hash);
    }
});

이 방법은 지금까지 시도한 대부분의 브라우저에서 잘 작동합니다.


1
Popstate는 해시 변경보다 더 최신입니다. 예를 들어 IE <10에서는 지원되지 않습니다.
Arturo Torres Sánchez



0

기능 기능을 감지 하려면 Modernizr 를 사용하십시오 . 일반적으로 jQuery는 브라우저 기능을 감지하기 위해 제공합니다 : http://api.jquery.com/jQuery.support/ . 그러나 해시 변경은 목록에 없습니다.

모더 나이저의 위키는 오래된 브라우저에 HTML5 기능을 추가 할 라이브러리의 목록을 제공합니다. hashchange에 대한 목록은 프로젝트에 대한 포인터를 포함 HTML5 역사 API 당신은 오래된 브라우저에서 동작을 모방하기를 원한다면 당신이 필요 기능을 제공 할 것으로 보인다.


0

@ johnny.rodgers의 업데이트 된 버전입니다.

희망은 누군가를 돕습니다.

// ie9 ve ie7 return true but never fire, lets remove ie less then 10
if(("onhashchange" in window) && navigator.userAgent.toLowerCase().indexOf('msie') == -1){ // event supported?
    window.onhashchange = function(){
        var url = window.location.hash.substring(1);
        alert(url);
    }
}
else{ // event not supported:
    var storedhash = window.location.hash;
    window.setInterval(function(){
        if(window.location.hash != storedhash){
            storedhash = window.location.hash;
            alert(url);
        }
    }, 100);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.