我有这个简单的html标记,由经典的asp:
生成<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')}); 它显示输出'可见'两次。
为什么会这样?
我的问题是我使用选择框过滤列上的表格。但是在过滤之后我需要对表中可见的那些行执行一些计算,但我现在得到所有行。
有什么想法吗?
/ Daniel
答案 0 :(得分:13)
:visible
选择器不会测试display
样式属性,而是要使用:hidden
代替the 1.3.2 release notes say:
...如果您的元素的CSS显示是 “无”,或其任何父/祖先 元素的显示是“无”,或者如果是 element的宽度为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
属性是不设置为none
。相反,:hidden
正确地将元素与style="display:none"
匹配,因此对非:hidden
元素的测试工作正常。
答案 1 :(得分:4)
答案 2 :(得分:2)
不确定这是否重要,但不隐藏()设置display: none;
而不是visible: hidden
?意味着隐藏的行仍然可见,它只是不显示...
答案 3 :(得分:0)
很可能你的trClass与display:none碰撞了.hide()设置。 当标签同时具有class属性和style属性时,将应用。 你应该密切关注你的trClass并从中取出显示内容。