【问题标题】:Why is my hidden <tr> not really hidden?为什么我隐藏的 <tr> 没有真正隐藏?
【发布时间】:2009-09-28 11:13:40
【问题描述】:

我有这个从经典 asp 生成的简单 html 标记:

<table>
  <tr class="trClass">
    <td>Hello </td>
  </tr>
  <tr class ="trClass">
    <td>World!</td> 
  </tr>
</table>

如果我使用 Jquery 将属于 Hello 的 tr 设置为 hide() 它会隐藏。好!

但是,当我使用这个 $('.trClass:visible').each(function() { alert('visible') }); 它显示输出“可见”两次。

这是为什么?

我的问题是我用选择框过滤列上的表格。但过滤后我需要对表中可见的那些行执行一些计算,但我现在得到所有行。

有什么想法吗?

/丹尼尔

【问题讨论】:

  • 请问可以提供演示页面吗?

标签: jquery visible


【解决方案1】:

:visible 选择器不测试display 样式属性,您想使用:hidden 代替the 1.3.2 release notes say

...如果你的元素的 CSS 显示是 “无”,或其任何父/祖先 元素的显示为“无”,或者如果 元素的宽度为 0 并且元素的 高度为 0 则元素将是 报告为隐藏。

这些将正确选择您的可见行:

$('.trClass:not(:hidden)').each(function() { 
    alert('visible'); 
});

或:

$('.trClass').each(function() { 
    if(!$(this).is(':hidden')) {
        alert('visible'); 
    }
});

或:

$('.trClass').filter('not:(:hidden)').each(function() { 
    alert('visible');
});

hide 将样式设置为display="none"。 jQuery 1.3.2 的release notes 也说:

在 jQuery 1.3.2 中,一个元素是可见的 如果其浏览器报告的 offsetWidth 或 offsetHeight 大于 0。

所以我猜在这种情况下,:visible 选择器错误地不匹配任何内容,因为根据执行的计算,行没有占用任何空间,尽管它们的 CSS display 属性是 不 em> 设置为none。相反,:hiddenstyle="display:none" 正确匹配元素,因此测试非 :hidden 元素就可以了。

【讨论】:

【解决方案2】:

You've found a legitimate bug。它在 1.3.2 中被破坏,但现在 fixed in trunk

According to Resig:

我们已经在寻找 'tr' 的情况 在IE中也有同样的问题

你想知道...

【讨论】:

  • @spx2:1.3.2 中的回归。以前的版本检查了display 属性。 1.3.2 使用了一个技巧来检查元素的 [缺少] 尺寸。请参阅@karim79 的第一句话。
  • @spx2 - 像往常一样,是程序员。
【解决方案3】:

不确定这是否重要,但没有 hide() 设置 display: none; 而不是 visible: hidden?这意味着隐藏的行仍然可见,只是没有显示......

【讨论】:

    【解决方案4】:

    很可能您的 trClass 与显示冲突:没有 .hide() 设置。 当标签同时具有 class 属性和 style 属性时,只会应用 on。 你应该仔细检查你的 trClass 并从中取出 display: 东西。

    【讨论】:

      猜你喜欢
      • 2022-08-07
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      • 2014-08-28
      • 1970-01-01
      • 2011-04-08
      • 2014-11-20
      • 1970-01-01
      相关资源
      最近更新 更多