jQuery-ハッシュ変更イベント


86

私は使っている:

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

関数をハッシュ変更イベントにバインドします。これはIE8、Firefox、Chromeで機能するようですが、Safariでは機能しないため、以前のバージョンのIEでは機能しないと思います。これらのブラウザでは、ハッシュとhashchangeイベントを使用するJavaScriptコードを無効にします。

ブラウザがhashchangeイベントをサポートしているかどうかを検出できるjQueryの方法はありますか?多分何かでjQuery.support...


4
jQueryhashchangeイベント-jQueryプラグインはIE8でも完璧に機能します。+それは非常に使いやすいです:)
enloz 2011

回答:


69

ブラウザがイベントをサポートしているかどうかは、次の方法で検出できます。

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

参照:


それと迅速な対応に感謝します。
イアンハーバート

19
IE7互換モードで実行されているIE8は、イベントがサポートされていない場合でも、ウィンドウの「onhashchange」に対してtrueを報告することに注意してください-jQuery Mobileから
Vikas

35

2017年の時点で更新された回答は、誰かがそれを必要とする場合、onhashchangeすべての主要なブラウザーで十分にサポートされているということです。詳細については、caniuseを参照してください。jQueryで使用するには、プラグインは必要ありません。

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

時折、ハッシュバンURLがまだ使用されているレガシーシステムに出くわします。これは役に立ちます。新しいものを構築してハッシュリンクを使用している場合は、代わりにHTML5 pushStateAPIの使用を検討することを強くお勧めします。


2
これはうまくwindow.location.hash機能し、現在のハッシュにアクセスするために使用します。
ダニエルデューハースト2018年


18

あなたの問題への別のアプローチ...

hashchangeイベントをメソッドにバインドする方法は3つあります。

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

または

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

または

<body onhashchange="doThisWhenTheHashChanges();">

これらはすべて、Win7のIE9、FF 5、Safari 5、およびChrome12で動作します。



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
クラス追加の必要性を回避して、ハッシュで始まるs$('a[href^="#"]')hrefのリンクを取得するために使用できます
tobymackenzie 2016

2

IE7およびIE9の場合、ステートメントがtrue(Windowsの "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
これはブラウザが処理するには多すぎませんか?100ミリ秒ごとにハッシュ変更をポーリングするには?
adardesign 2011

5
あなたのサンプルコードは、私がタスクマネージャーを開いてプロセスを
強制終了

これは、「storedHash」の代わりに「prevHash」を使用するとタイプミスが発生するためです。彼は基本的に、それが宣言された方法とは異なる変数名を使用しました。
ニック

2

ハッシュイベントの代わりに別の方法を使用して、ポップステートのように聞くのはどうですか。

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

この方法は、これまでに試したほとんどのブラウザーで正常に機能します。


1
Popstateはhashchangeよりもさらに新しいです。例えば、それはIE <10でサポートされていない
アルトゥーロ・トレス・サンチェス



0

機能機能の検出にはModernizrを使用します。一般に、jQueryはブラウザ機能の検出を提供します:http//api.jquery.com/jQuery.support/。ただし、hashchangeはリストにありません。

Modernizrwikiは、古いブラウザにHTML5機能を追加するためのライブラリのリストを提供しています。hashchangeリストには、プロジェクトHTML5 History 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.