如何获得当前正在显示的长文档的哪一部分的指示?
例如,如果我的 html 包含 1,000 行
1
2
3
...
999
1000
并且用户在显示第 500 行的中间附近,那么我想得到“500\n501\n502”或类似的东西。
显然大多数情况会比这更复杂,但我的要求是找到当前正在浏览器视口中显示的文本,以便我可以显示适合当前文本的状态值。
谢谢马丁
如何获得当前正在显示的长文档的哪一部分的指示?
例如,如果我的 html 包含 1,000 行
1
2
3
...
999
1000
并且用户在显示第 500 行的中间附近,那么我想得到“500\n501\n502”或类似的东西。
显然大多数情况会比这更复杂,但我的要求是找到当前正在浏览器视口中显示的文本,以便我可以显示适合当前文本的状态值。
谢谢马丁
如果你有 jQuery,你可以使用这个函数来检查一个 DOM 元素当前是否显示在视口中:
function isInView(elem) {
var docViewTop = $(window).scrollTop();
var docViewBottom = docViewTop + $(window).height();
var elemTop = $(elem).offset().top;
var elemBottom = elemTop + $(elem).height();
return ((elemBottom >= docViewTop) && (elemTop <= docViewBottom));
}
您可以从 scrollTop 属性中获取以像素为单位的值:
document.body.scrollTop = 40;
要知道文档的哪一部分是可见的,您可以遍历(比如说)所有 p 标记,直到找到一个具有负 scrollTop 值的标记。之前的那个是窗口顶部的那个。
我刚刚在msdn上看到了一段示例代码
function isinView(oObject)
{
var oParent = oObject.offsetParent;
var iOffsetTop = oObject.offsetTop;
var iClientHeight = oParent.clientHeight;
if (iOffsetTop > iClientHeight) {
alert("Special Text not in view. Expand Window to put Text in View.");
}
else{
alert("Special Text in View!");
}
}
是的,有办法。我将使用 YUI 的 API 来说明我的示例。首先,您的文本必须在某种 dom 元素中,无论是 span、div、p 还是其他任何东西,它都必须在一个元素中。在这里,我将假设列表项
var viewPortY = YAHOO.util.Dom.getDocumentScrollTop(),
viewPortHeight = YAHOO.util.Dom.getViewportHeight(), i = 0,
// get all the dom elements that contain the text, sorry if this isn't exact, its just a rough example
items = YAHOO.util.Dom.getElementBy(null, 'li', document.getElementById('item-container')),
viewedItems = [];
for (i = 0 ; i < items.length; i++) {
var y = YAHOO.util.Dom.getY(items[i])
if (y > viewPortY && y < (viewPortY + viewPortHeight)) {
viewedItems.push(items[i])
}
}
所以本质上,我得到了所有包含你感兴趣的文本的 dom 对象。然后我循环遍历,无论谁的 Y 坐标在视口 Y 和 Y + ViewPort Height 之间,我都会放入一个数组。
我实施了我认为更适合我的环境的解决方案:
我正在为 Android 编写,因此我可以轻松地与来自 javascript 的 Java 类进行交互。我的实际解决方案涉及获取offsetTop
我感兴趣的所有标签并将偏移量传递给 java。
window.pageYOffset
还注册了一个传递给同一个 Java 类的 onscroll 处理程序。然后java类可以比较offsetTop
每个标签,pageYOffset
看看哪个标签在当前视口的顶部。