私はこの問題を抱えています(私はjQueryを使用していますが、それに制限されていません):
アンカーナビゲーション(#id)とAjaxリクエストの組み合わせを使用しています。ページを所定の位置に移動する(アンカーナビゲーションを使用)、または情報をフェッチする(Ajaxを使用)には、onhashchangeイベントを使用します。
編集:私は少しタイプミスがありました。mouseDownフラグがtrueであり、hashchangeイベントがトリガーされたかどうかを確認するのを忘れたので、ifステートメントを追加しました。
jQueryでは次のようになります:(もちろん、このコードは関数にラップされ、DOMの読み込み時に初期化されますが、質問には関係ありません)
$(window).bind('hashchange', function(e) { }
onhashchangeをサポートするブラウザーのみがコードを読み取るようにするために、次のようにカプセル化します。
if ('onhashchange' in window) {
$(window).bind('hashchange', function(e) { }
}
私のWebアプリは、ブラウザーの戻る/進むボタンを押したときにのみonhashchangeイベントをトリガーするように作成されています。それをするために私はこれが好きです:
if ('onhashchange' in window) {
$(window).bind('mousedown hashchange', function(e) { }
}
ビューポート内をクリックすると、mousedownイベントがトリガーされます。mousedownイベントがトリガーされた場合、ブラウザーの戻る/進むボタンをクリックしなかったことがわかり、次のようなフラグを使用してonhashchangeイベントを停止できます。
var mouseDown = false;
if ('onhashchange' in window) {
$(window).bind('mousedown hashchange', function(e) {
if (e.type === 'mousedown') {
mouseDown = true;
}
if (mouseDown && e.type === 'hashchange') {
// if the mousedown event was triggered and when the haschange event triggers,
// we need to stop the hashchange event and restore the mouseDown flag
mouseDown = false;
e.stopPropagation();
}
if (!mouseDown && e.type === 'hashchange') {
// Do the onhashchange stuff here
}
}
}
これは、マウスイベントをウィンドウオブジェクト(?)にバインドできないことをシームするため、IEに問題を引き起こします。IEはmousedownイベントを「見る」ことはありません。
このIEの問題を解決するために、「clientY」プロパティを取得できます。このプロパティは、IEのすべてのイベント呼び出しで渡され、マウスの座標を示します。e.clientYが0未満の場合、マウスはビューポートの外側にあり、ブラウザの戻る/進むボタンをクリックしてonhashchangeをトリガーしたことがわかります。これで、次のようになります。
var mouseDown = false;
if ('onhashchange' in window) {
$(window).bind('mousedown hashchange', function(e) {
// IE: Use e.clientY to check if the mouse position was within the viewport (i.e. not a nagative value for Y)
// !IE: Use e.type
if (e.type === 'mousedown' || e.clientY > 0 ) {
mouseDown = true;
}
if (mouseDown && e.type === 'hashchange') {
// if the mousedown event was triggered and when the haschange event triggers,
// we need to stop the hashchange event and restore the mouseDown flag
mouseDown = false;
e.stopPropagation();
}
if (!mouseDown && e.type === 'hashchange') {
// Do the onhashchange stuff here
}
}
}
このソリューションは、キーボードの矢印を使用してナビゲートするためのサポートを追加する必要があるまで、魅力のように機能していました。これで、画面上のどこにマウスがあるかは関係ありません。IEウィンドウが「アクティブ」である限り、キーボード入力をリッスンするキーダウンイベントは、キーボードを押すとトリガーされます。これは、clientYチェックが意図したとおりに機能しなくなったことを意味します。
問題:
私の知る限り、onhashchangeはウィンドウオブジェクトにバインドする必要があります。別のイベントをリッスンして1つのイベントを制御できるようにする場合は、すべてのイベントを同じコールバック関数内で処理する必要があります。
どうすればこれを機能させることができますか?