jsでURLアンカー変更イベントを処理する


回答:


126

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.60Firefox 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/を

編集:更新されたブラウザのサポート(再度)。


完全を期すvar storedHash = window.location.hash;には、まとめる要約ブロックに追加します。ところで:最近これはポリフィルと呼ばれていると思います。
Frank Nocke 2013年

1
最近ではhashChangewindow stackoverflow.com
questions / 6390341 / how

@AndyE私は答えを読みました、私は小さなメモを見逃しました、そして私はこのようなイベントを見たことがありませんhashChanged(storedHash);
Timo Huovinen

1
@TimoHuovinen:、hashChangedこの場合、開発者がこのコードを使用して実装する関数を意図しています。ここでの答えは、onhashchangeイベントが利用できない場合に変更をハッシュで監視する方法を示し、イベントベースのアプローチとタイマーベースのアプローチを組み合わせて、ユニバーサルソリューションを提供することです。私のポイントは、あなたがリンクした答えはここでの答えに絶対に何も追加しないということです;-)。それらは、Ben AlmanのjQueryプラグインへのリンクでさえ、同じ基本情報を提供します。唯一の違いは、答えに純粋なJSソリューションを提供したことです。
Andy E

1
軽量のJSルーターを探していましたが、これでうまくいきました。すべての依存関係も排除:)
gskema '22 / 06/14


3

addEventListener上書きする代わりにを使用することをお勧めしますwindow.onhashchange。そうしないと、他のプラグインのイベントがブロックされます。

window.addEventListener('hashchange', function() {
...
})

今日のグローバルなブラウザーの使用状況を見ると、フォールバックはもう必要ありません。


2

他のSOの質問で私が見たことから、実行可能な唯一のクロスブラウザーソリューションはタイマーです。たとえば、この質問をチェックしてください。


1

(参考までに。)YUI3 "hashchange"合成イベントは、受け入れられた回答とほぼ同じことを行います

YUI().use('history-hash', function (Y) {
  Y.on('hashchange', function (e) {
    // Handle hashchange events on the current window.
  }, Y.config.win);
});

0

あなたはこれからより多くの情報を得ることができます

変異イベントタイプ

ミューテーションイベントモジュールは、attrやテキストの変更など、ドキュメントの構造に対する変更を通知できるように設計されています。


これはDOMの変更についてです。
Raj
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.