我在jQuery中遇到了一些令人困惑的结果,包括attr('class')和hasClass()。基本上,我遍历表行并确定下一个可见表行是否具有某个类。
$('table#blocks tr.region').each(function () {
var next_row = $(this).nextAll('tr:visible');
console.log('This: ' + $(this).attr('class') + ' Next: ' + next_row.attr('class') + ' Next is a region: ' + next_row.hasClass('region'));
});
当我运行此脚本时,日志显示:
这个:区域 - 左边下一个:区域 - 右边接下来是一个区域:true
这个:区域右 - 下一个:区域 - 内容接下来是一个区域:true
这:区域区域内容下一页:可拖动甚至已显示_on_home shown_on_infozone 接下来是一个区域: true
这:区域region-header下一页: region-message region-header-message region-empty 接下来是一个区域: true
这:区域区域页脚下一页:区域消息region-footer-message region-empty 接下来是一个区域: true
这个:区域区域 - 1下一个:未定义下一个是区域:false
因此,该消息清楚地表明某些行具有类'region'而某些行没有,但它们都为hasClass()返回true!
任何人都可以对此有所了解吗?
谢谢:)
答案 0 :(得分:1)
错误部分来自您使用nextAll()
“查找当前元素之后的所有兄弟元素”。因此,您始终选择跟随当前行的所有可见行。
如果您重读有关它们的文档,可以解释attr()
和hasClass()
返回的值之间的差异
attr(姓名)
访问该地产 第一个匹配的元素。
VS
hasClass(class)
如果指定的类是,则返回true 出现在至少一组中 匹配的元素。
这解释了一切。您使用选择多个兄弟姐妹的nextAll
,attr
仅显示匹配的第一个元素的class
属性,而hasClass
如果匹配的所有元素中的一个具有该类,则返回true
我的建议是使用var next_row = $(this).next('tr:visible');
。这只会给你下一个可见的兄弟行。
答案 1 :(得分:0)
我找到了答案!当我在console.log中得到结果:
var next_row = $(this).nextAll('tr:visible');
它声明next_row是一个[Object object],当它实际上是一个对象数组时。我发现这是使用调试器;所以我只需要将行改为:
var next_row = $(this).nextAll('tr:visible:first');
现在它有效。
谢谢:)
答案 2 :(得分:0)
首先,你不应该在迭代器中声明“var”。总是在外面宣布。
你的.hasClass('region')将始终返回true,因为你的next_row返回所有tr元素。请改用.next('tr:visible')。
使用.attr()获取不同类的原因是它返回选择器的第一个元素。
..弗雷德里克