javascript - 如何计算 HTML 表格中*可见*行的数量?

标签 javascript html jsf-2 primefaces

我打算在 PrimeFaces (5.2) 中显示一个(只读、无过滤、无延迟加载)表格,其中表格应一直延伸到页脚,并带有“空行”,如果有的话行数不够。页脚有固定位置,因此如果行太多,表格会出现滚动条。似乎获取空行的标准解决方案是随结果一起返回“假行”。但我不知道要返回多少行,因为服务器不知道客户端可以看到多少行,所以我返回更多可以合理看到的行(100)。我的计划是通过检查它们的“可见性”,用 JavaScript 删除不需要的虚拟行,但这被证明是一项不可能完成的任务。到目前为止,我还没有见过检查可见性的方法。我的表定义如下:

<p:dataTable id="tableId" var="orderView" value="#{orderTable.getPaddedOrderViews(100)}" 
          emptyMessage="EMPTY" scrollable="true" scrollHeight="550"
          resizableColumns="true" resizeMode="fit">
    ...

(getPaddedOrderViews(100) 应返回至少 100 行,如果需要则用虚拟行填充)

下面的代码应该找到可见/不可见的行(这样我可以稍后更改它以删除不可见的虚拟行):

      function isVisible1(ele) {
          if (ele !== null &&
              ele !== undefined &&
              ele.clientWidth !== 0 &&
              ele.clientHeight !== 0) {
              var style = window.getComputedStyle(ele,null);
              return style !== null &&
                  style !== undefined &&
                  style.opacity !== 0 &&
                  style.visibility !== 'hidden' &&
                  style.display !== 'none';
          }
          return false;
      }
      function isVisible2(ele) {
          return ele !== null &&
              ele !== undefined &&
              ele.clientWidth !== 0 &&
              ele.clientHeight !== 0 &&
              ele.style !== null &&
              ele.style !== undefined &&
              ele.style.opacity !== 0 &&
              ele.style.visibility !== 'hidden' &&
              ele.style.display !== 'none';
      }
      function isVisible3(ele) {
          return ele.offsetWidth > 0 || ele.offsetHeight > 0;
      }
      function countVisibleRows() {
          var count = 0;
          var result1 = 0;
          var result2 = 0;
          var result3 = 0;
          var r;
          for (r in document.getElementById("tableId_data").rows) {
              count++;
              /*
              FAILS BECAUSE window.getComputedStyle(ele,null) says
              argument 1 is not an object
              if (isVisible1(r)) {
                  result1++;
              }*/
              if (isVisible2(r)) {
                  result2++;
              }
              if (isVisible3(r)) {
                  result3++;
              }
          }
          return [count,result1,result2,result3];
      }

        jQuery(document).ready(function () {
            jQuery(document).ready(function () {
                // twice in document.ready to execute after Primefaces callbacks
                try {
                    alert("ROWS: "+countVisibleRows());
                }
                catch(err) {
                    alert(err.message);
                }
            });
        });

但它显示“ROWS: [103,0,0,0]”表,我可以在其中看到大约 22 行(非空/虚拟)(我希望获得的数字),还有更多隐藏的行。有些是我的虚拟行,但在这种情况下我看不到任何行。 103 证明(恕我直言),我正确地获取了行。

isVisible1(ele) 调用 window.getCompulatedStyle(ele,null) 时失败。 isVisible2(ele) 始终返回 false,因为没有行具有样式属性,并且 isVisible3(ele) 也始终返回 false。

那么,为什么这些行没有任何“样式”,我如何判断它们在没有这种“样式”的情况下是否可见?

有关计算可见行数的许多问题/解决方案仅适用于“过滤”表,但这不适用于我的情况。

如果可以以某种方式从表本身中提取可见行数,而不是检查行,那也可以解决我的问题。

我基于this问题以了解如何检查可见性。

最佳答案

如果我理解正确的话,您想删除溢出行。

由于您使用的是 jQuery,因此可以通过将行的偏移量与容器底部的偏移量进行比较来轻松完成此操作

var $cont = $('#container')
var contBottom = $cont.height() + $cont.offset().top;

$('tr').filter(function () {
    var $row = $(this),
        top = $row.offset().top,
        ht = $row.height();        
    return (top + ht) > contBottom;
}).remove()

DEMO

关于javascript - 如何计算 HTML 表格中*可见*行的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33043003/

相关文章:

javascript - 从 Mac Cocoa 应用程序内提交 HTML 表单

html - HTML 定义列表的用例和 Bootstrap 问题

html - 生成动态html

JSF - 在单个 bean 中在 @ManagedProperty 上设置多个值

java - Helloworld JSF2.0 页面未呈现为 html 标签

php - 如何将数组编码为 JSON?

javascript - 为什么我的按钮不再调用该函数?

javascript - 当我将 javascript 代码放入外部 Site.js 文件中时,Ajax pagemethod 不起作用

html - 导航栏高度变化不影响事件区域

java - Mojarra 中的高 session 内存使用率