爲了計算的元素是否是可見的,你可以創建這樣的功能(信用由於這裏https://stackoverflow.com/a/22480938/825240):
function isScrolledIntoView(element) {
var elementTop = element.getBoundingRect().top;
var elementBottom = element.getBoundingRect().bottom;
var isVisible = (elementTop <= window.innerHeight) && (elementBottom >= 0);
return isVisible;
}
您可以通過元素是否已被讀取計算自定義功能,根據您的情況:
function isRead(element) {
var elementTop = element.getBoundingRect().top;
var elementBottom = element.getBoundingRect().bottom;
var elementHeight = elementBottom - elementTop;
// if 75% of the document has been scrolled, we'll assume it's been read
var readIfPercentage = 0.75;
// an element has been read if the top has been scrolled up out of view
// and at least 75% of the element is no longer visible
var isRead = (elementTop < 0 && Math.abs(elementTop)/elementHeight >= readIfPercentage);
return isRead;
}
然後可以調用上述的功能,在DOM節點傳遞作爲元件:
isScrolledIntoView(document.getElementById('targetDiv');
//or
isRead(document.getElementById('targetDiv');
可以通過創建一個滾動聽者將其結合在一起(jQuery讓這很容易):
function setScrollListener() {
var scrollEventHandler = function() {
if (isRead(document.getElementById('article'))) {
// set article to 'read'
}
}
// on scroll, fire the event handler
$(document).scroll(scrollEventHandler);
}
值得注意的是,如果你想解除滾動監聽器的綁定,比如說如果所有的文章都被讀取了,而你不再需要監聽滾動文件,你可以調用scrollEventHandler中的解除綁定函數。它是如此簡單:
function unbindScrollEventHandler() {
$(document).unbind('scroll', scrollEventHandler);
}
這是一個有趣的假設,所以這次我非常小心避免進入任何內容。我從滾動下拉按鈕開始,然後圍繞窗口外側,然後下降到允許我在展開/列表視圖之間切換的區域,並將條目標記爲已讀。 – smoody 2008-12-09 20:53:13