私は使っている:
$(window).bind( 'hashchange', function(e) { });
ハッシュ変更イベントに関数をバインドします。これはIE8、Firefox、Chromeで動作するようですが、Safariでは動作せず、IEの以前のバージョンでは動作しないと思います。これらのブラウザーでは、ハッシュとhashchange
イベントを使用するJavaScriptコードを無効にします。
ブラウザがhashchange
イベントをサポートしているかどうかを検出できるjQueryの方法はありますか?たぶんjQuery.support
...と何か.
ブラウザがイベントをサポートしているかどうかは、次の方法で検出できます。
if ("onhashchange" in window) {
//...
}
こちらもご覧ください:
2017年時点での更新された回答は、誰でも必要な場合、onhashchange
はすべての主要なブラウザーで十分にサポートされているということです。詳細については、 caniuse を参照してください。 jQueryで使用するには、プラグインは必要ありません。
$( window ).on( 'hashchange', function( e ) {
console.log( 'hash changed' );
} );
時々、hashbang URLがまだ使用されているレガシーシステムに遭遇しますが、これは役に立ちます。新しいものを作成してハッシュリンクを使用している場合は、代わりにHTML5 pushState APIの使用を検討することを強くお勧めします。
問題に対する別のアプローチ...
Hashchangeイベントをメソッドにバインドするには、3つの方法があります。
<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で動作します。
機能とクロスブラウザの問題をまとめるhashchangeプラグインがあります こちらから入手可能 。
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;
私はちょうど同じ問題に遭遇しました(IE7のhashchangeイベントの欠如)。私の目的に合った回避策は、ハッシュを変更するリンクのクリックイベントをバインドすることでした。
<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>
IE 7およびIE 9の場合、(windowsの "onhashchange")に対して文がtrueになりますが、window.onhashchangeは起動しないため、ハッシュを保存する方が良いことに注意してください。 IEのすべてのバージョンで変更されたかどうかを100ミリ秒ごとに確認します。
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);
}
ハッシュイベントの代わりに別の方法を使用してpopstateをリッスンするのはどうですか。
window.addEventListener('popstate', function(event)
{
if(window.location.hash) {
var hash = window.location.hash;
console.log(hash);
}
});
この方法は、これまで試したほとんどのブラウザーで正常に機能します。
この小さなjQueryプラグインは非常に使いやすいです。 https://github.com/finnlabs/jquery.observehashchange/
Chris Coyierがそのハッシュ問題の解決策を持っていると思います。彼のスクリーンキャストを見てください:
@ 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);
}
機能機能の検出には、 Modernizr を使用します。一般に、jQueryはブラウザ機能を検出するために提供しています: http://api.jquery.com/jQuery.support/ 。ただし、hashchangeはリストに含まれていません。
Modernizrのwiki は、古いブラウザーにHTML5機能を追加するためのライブラリーのリストを提供します。 hashchangeのリスト にはプロジェクトへのポインターが含まれています HTML5 History API は、古いブラウザーで動作をエミュレートする場合に必要な機能を提供しているようです。