簡體   English   中英

如何檢測onscroll事件是否以編程方式生成?

[英]How to I detect if an onscroll event was programmatically generated?

我想在用戶滾動時觸發處理程序,但是當瀏覽器代表用戶滾動時我不希望它發生。 例如,下面的文檔將自身滾動為onload的一部分。 這會觸發我的onscroll處理程序,但我不希望它。 即使我刪除了onload,仍然存在一個問題:如果用戶滾動然后重新加載頁面,則處理程序會在重新加載時觸發。 再說一遍,我不希望如此。

處理程序可以檢測是誰導致它被解雇了嗎?

<html>
 <body onscroll="alert('scroll detected')"
       onload="window.scrollBy(0, document.height)">
  aaa<br/>bbb<br/>ccc<br/>ddd<br/>eee<br/>fff<br/>ggg<br/>hhh<br/>iii<br/>
  jjj<br/>kkk<br/>lll<br/>mmm<br/>nnn<br/>ooo<br/>ppp<br/>qqq<br/>rrr<br/>
  sss<br/>ttt<br/>uuu<br/>vvv<br/>www<br/>xxx<br/>yyy<br/>zzz
 </body>
</html>

每當您以編程方式移動屏幕時設置(布爾)標志,並在移動完成時再次取消設置怎么樣? 那么你的滾動偵聽器會首先檢查該標志,並根據它做出它的動作?

在僅檢查操作的結果(文檔已滾動)時,您無法確定導致操作的原因。

檢查操作之前和之后某些屬性的狀態更改將幫助您確定操作的原因,假設此類相關屬性根據更改的原因而有所不同。

您應該考慮可能與滾動文檔的操作相關的屬性,然后考慮這些屬性可能如何更改:

  • 作為滾動文檔的結果
  • 當一個人進行滾動時
  • 當瀏覽器執行滾動時

當一個人滾動文檔時,他們可以:

  • 點擊一個鍵(向下箭頭,向上箭頭,向下翻頁,向上翻頁,ctrl-end,ctrl-home)
  • 將指針移動到滾動條,單擊一下,遠離滾動條

以下事件模式表示某人滾動:

  • 按下滾動相關鍵鼠標移出瀏覽器畫布(在滾動條上)
  • 文件滾動

在瀏覽器執行動作的情況下,文檔僅滾動而沒有任何先前的相關鍵或鼠標事件。

在觀察滾動事件發生之前發生的事情時,您應該能夠確定該動作是否是由人發起的。 雖然這可能很難實現,但邏輯是合理的。

如何在document.onReady事件期間添加onscroll事件,而不是在body命令上內聯? 我認為這應該允許瀏覽器在添加onScroll事件之前滾動到該位置。

另一種選擇是添加一個setTimeout()來調用一個函數,在文檔完全呈現后的幾百毫秒內添加onscroll事件。

簡而言之:你做不到

雖然,在Prototype等javascript庫的幫助下做這樣的事情會很容易使用自定義事件:

<script language="javascript">
    document.observe('user:scrolling', function() { alert('yay!'); });
</script>
...
<body onscroll="document.fire('user:scrolling')">

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM