javascript - 检查表行是不是在视图中[重复]

Posted

技术标签:

【中文标题】javascript - 检查表行是不是在视图中[重复]【英文标题】:javascript - check if table row is in view [duplicate]javascript - 检查表行是否在视图中[重复] 【发布时间】:2013-06-04 18:47:04 【问题描述】:

我有一个有很多行的table,这个表绑定在一个具有固定高度的div 中,所以我的表有一个滚动条。现在我怎样才能知道哪些行在视图中?

我为每一行分配了唯一的 ID。 我没有使用任何库,所以在纯 javascript 和 IE 中寻找解决方案

我在页面上有一个按钮,其 onclick 应该告诉我该行是否在视图中滚动

function check()
     
var row5 = document.getElementById("r5");
var b = document.getElementById("boundary");            
    if(!NeedThisFunction(row5,b))
        alert("not in view");
    else
        alert("in view");
    


<button  onclick="check()" >Check</button >    
<div id="boundary" style="overflow:scroll;height:100px">
    <table border="1" >
    <tr id="r1">
    <td>row 1 col1</td>
    <td>row 1 col2</td>
    <td>row 1 col3</td>
    <td>row 1 col4</td>
    </tr>
    ...
    <tr id="r100">
    <td>row 100 col1</td>
    <td>row 100 col2</td>
    <td>row 100 col3</td>
    <td>row 100 col4</td>
    </tr>
    </table>
    </div>

【问题讨论】:

看起来相似,但那里接受的解决方案对我不起作用:( 您是否包含isElementInViewport 的代码? @Nitin:你能解释一下什么是有效的吗?你有没有收到错误,或者是什么问题?您遵循了哪个答案(有多个)?如果您只是说“它不起作用”,我们将无法帮助您。 是的,我采用了已接受答案的解决方案,但它总是返回“不在视图中”。答案似乎是将整个窗口作为其视口。 【参考方案1】:

使用How to tell if a DOM element is visible in the current viewport? 接受的答案并对其进行修改,您可以使用如下内容:

function isElementInViewport(par, el) 
    var elRect = el.getBoundingClientRect(),
        parRect = par.getBoundingClientRect();
    return (
        elRect.top >= parRect.top &&
        elRect.left >= parRect.left &&
        elRect.bottom <= parRect.bottom &&
        elRect.right <= parRect.right
    );


function check() 
    var container = document.getElementById("boundary"),
        tr = container.getElementsByTagName("tr"),
        visible = [],
        i, j, cur;
    for (i = 0, j = tr.length; i < j; i++) 
        cur = tr[i];
        if (isElementInViewport(container, cur)) 
            visible.push(cur.id);
        
    
    console.log("Visible rows:", visible.join(", "));


function addEvent(element, eventName, callback) 
    if (element.addEventListener) 
        element.addEventListener(eventName, callback, false);
     else if (element.attachEvent) 
        element.attachEvent("on" + eventName, callback);
    


addEvent(window, "load", function () 
    addEvent(document.getElementById("check_btn"), "click", check);
    addEvent(document.getElementById("boundary"), "scroll", check);
);

演示: http://jsfiddle.net/jpQBU/3/

根据您想要的严格程度,您可以更改比较。就目前而言,该元素必须完全可见。因此,如果您只滚动一个像素太远以至于看不到一行的一小部分,它将不会包括它。

【讨论】:

错误:tr = container.querySelectorAll("tr") 处的“对象不支持此属性或方法”。我用的是 IE,没有 JS 库 @NitinChaudhari 我明白了,对此感到抱歉。我实际上不确定我为什么使用它......还有另一种方法可以完全满足需要并且在浏览器中得到更好的支持。 IE 8 之前的版本不支持它。您使用的是 IE 7 吗?我会在一分钟内更新答案 谢谢,为我工作。 @NitinChaudhari 太棒了,很高兴你也能正常工作:) 您能否更新解决方案以在滚动结束时记录视图中的行?

以上是关于javascript - 检查表行是不是在视图中[重复]的主要内容,如果未能解决你的问题,请参考以下文章

当复选框将状态更改为“已检查”(纯javascript)时跨表行

MySQL 从表中获取数据并检查表行中是不是存在用户 ID

在 NSuserdefaults 中保存选定的检查表行

检查材料表行是不是仍处于编辑模式

使用 MVC Razor 语法检查视图模型属性在 Javascript 中是不是具有值

Javascript / jQuery:如何检查日期是不是是一个月的最后一天