[解決済み] スクロールイベントがユーザーによって作成されたかどうかを検出する
2023-02-01 06:02:16
質問
スクロールイベントがブラウザによって行われたのか、ユーザーによって行われたのかを見分けることは可能でしょうか。具体的には、戻るボタンを使用するとき、ブラウザは最後の既知のスクロール位置にジャンプすることがあります。スクロール イベントにバインドする場合、これがユーザーによって引き起こされたのか、それともブラウザーによって引き起こされたのかをどのように見分けることができますか?
$(document).scroll( function(){
//who did this?!
});
ブラウザでスクロールが発生する状況には3種類ありますね。
- ユーザーが何らかのアクションを実行した。たとえば、マウス ホイール、矢印キー、ページ アップ/ダウン キー、ホーム/エンド キーを使用する、スクロール バーをクリックする、または親指をドラッグする、などです。
- ブラウザが自動的にスクロールする。たとえば、ブラウザの戻るボタンを使用すると、最後の既知のスクロール位置に自動的にジャンプします。
-
Javascript がスクロールします。例えば
element.scrollTo(x,y)
.
どのように解決するのですか?
残念ながら、それを直接伝える方法はありません。
私が言いたいのは、もしあなたが リデザイン このようなフローに依存しないように、アプリを再設計できるのであれば、そうしてください。
そうでない場合は ワークアラウンド
私が思いつくのは、ユーザーが開始したスクロールを追跡し、スクロールがブラウザによって引き起こされたのか、ユーザーによって引き起こされたのかを確認するためにそれをチェックすることです。これはかなりうまくいく例です (ただし、jQuery の履歴に問題があるブラウザを除きます)。
完全にテストできるようにするには、これをローカルで実行する必要があります(jsFiddle/jsbinはコンテンツをiFrame化するため、あまり適していません)。
ここに テストケース を検証してみました。
-
ページの読み込み
userScroll
はfalse
-
マウス/キーボードを使ったスクロール-。
userScroll
となるtrue
-
リンクをクリックするとページ下にジャンプします。
userScroll
となるfalse
-
戻る/進むをクリックします。
userScroll
になるfalse
;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<script src="http://code.jquery.com/jquery-1.6.1.min.js"></script>
<script type="text/javascript" src="https://raw.github.com/tkyk/jquery-history-plugin/master/jquery.history.js"></script>
</head>
<body>
<span> hello there </span><br/>
<a href="#bottom"> click here to go down </a>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
<a name="bottom"> just sitting </a>
</body>
<script type="text/javascript">
var userScroll = false;
function mouseEvent(e) {
userScroll = true;
}
$(function() {
// reset flag on back/forward
$.history.init(function(hash){
userScroll = false;
});
$(document).keydown(function(e) {
if(e.which == 33 // page up
|| e.which == 34 // page dn
|| e.which == 32 // spacebar
|| e.which == 38 // up
|| e.which == 40 // down
|| (e.ctrlKey && e.which == 36) // ctrl + home
|| (e.ctrlKey && e.which == 35) // ctrl + end
) {
userScroll = true;
}
});
// detect user scroll through mouse
// Mozilla/Webkit
if(window.addEventListener) {
document.addEventListener('DOMMouseScroll', mouseEvent, false);
}
//for IE/OPERA etc
document.onmousewheel = mouseEvent;
// to reset flag when named anchors are clicked
$('a[href*=#]').click(function() {
userScroll = false;
});
// detect browser/user scroll
$(document).scroll( function(){
console.log('Scroll initiated by ' + (userScroll == true ? "user" : "browser"));
});
});
</script>
</html>
注意事項
- これは、ユーザーがマウスでスクロールバーをドラッグしたときのスクロールを追跡しません。これは、いくつかのより多くのコードで追加することができますが、私はあなたのための練習として残しました。
-
event.keyCodes
はOSによって異なる可能性があるので、適切に変更する必要があるかもしれません。
これが役に立つことを願っています。
関連
-
[解決済み] JavaScript/jQueryでページの一番上にスクロールするには?
-
[解決済み] JSONPとは何か、なぜ作られたのか?
-
[解決済み] 動的に生成された要素にイベントバインディングを行うか?
-
[解決済み] jQueryイベントKeypress。どのキーが押されたか?
-
[解決済み] なぜ "use strict "はパフォーマンスを10倍向上させるのか?
-
[解決済み] Javascript / jQueryでAndroid端末を検出する。
-
[解決済み] react-routerのハッシュフラグメントからクエリパラメータを取得する
-
[解決済み] Reactメモを使うべきではない場合とは?
-
[解決済み] Javascript の parseInt() で先頭のゼロを削除する。
-
[解決済み] Chrome拡張機能:popup.htmlを強制終了させる
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Google maps API V3 - 同一地点に複数のマーカーを設置する。
-
[解決済み] reactのrender関数でdynamic hrefを作成するには?
-
[解決済み] 無効になっている入力フィールドの値を送信する
-
[解決済み] jQueryの$という記号の意味は何ですか?
-
[解決済み] コールバック地獄とは何か、RXはそれをどのように、そしてなぜ解決するのか?
-
[解決済み] TypeScriptプロジェクトで既存のC#クラス定義を再利用する方法
-
[解決済み] AJAX Mailchimp サインアップフォームの統合
-
[解決済み] 各オブジェクトに?重複
-
[解決済み] JavaScriptで長い配列を小さい配列に分割する方法
-
[解決済み] javascriptでオプションのパラメータを扱う