URLアンカーの変更時に実行されるJavaScriptコールバックコードをどのように記述できますか?
例えばhttp://example.com#a
へhttp://example.com#b
回答:
Googleカスタム検索エンジンはタイマーを使用してハッシュを以前の値と照合しますが、別のドメインの子iframeは親の場所のハッシュを更新してiframeドキュメントの本文のサイズを含めます。タイマーが変更をキャッチすると、親はiframeのサイズを変更して本体に合わせて、スクロールバーが表示されないようにすることができます。
次のようなものが同じことを実現します。
var storedHash = window.location.hash;
window.setInterval(function () {
if (window.location.hash != storedHash) {
storedHash = window.location.hash;
hashChanged(storedHash);
}
}, 100); // Google uses 100ms intervals I think, might be lower
Google Chrome 5、Safari 5、Opera 10.60、Firefox 3.6およびInternet Explorer 8は すべてこのhashchange
イベントをサポートしています。
if ("onhashchange" in window) // does the browser support the hashchange event?
window.onhashchange = function () {
hashChanged(window.location.hash);
}
そしてそれを一緒に入れます:
if ("onhashchange" in window) { // event supported?
window.onhashchange = function () {
hashChanged(window.location.hash);
}
}
else { // event not supported:
var storedHash = window.location.hash;
window.setInterval(function () {
if (window.location.hash != storedHash) {
storedHash = window.location.hash;
hashChanged(storedHash);
}
}, 100);
}
- jQueryのもなhashchangeイベントを確認し、必要に応じて、独自に提供されますプラグインがありhttp://benalman.com/projects/jquery-hashchange-plugin/を。
編集:更新されたブラウザのサポート(再度)。
hashChanged(storedHash);
hashChanged
この場合、開発者がこのコードを使用して実装する関数を意図しています。ここでの答えは、onhashchange
イベントが利用できない場合に変更をハッシュで監視する方法を示し、イベントベースのアプローチとタイマーベースのアプローチを組み合わせて、ユニバーサルソリューションを提供することです。私のポイントは、あなたがリンクした答えはここでの答えに絶対に何も追加しないということです;-)。それらは、Ben AlmanのjQueryプラグインへのリンクでさえ、同じ基本情報を提供します。唯一の違いは、答えに純粋なJSソリューションを提供したことです。
addEventListener
上書きする代わりにを使用することをお勧めしますwindow.onhashchange
。そうしないと、他のプラグインのイベントがブロックされます。
window.addEventListener('hashchange', function() {
...
})
今日のグローバルなブラウザーの使用状況を見ると、フォールバックはもう必要ありません。
var storedHash = window.location.hash;
には、まとめる要約ブロックに追加します。ところで:最近これはポリフィルと呼ばれていると思います。