attr('class')和hasClass()给出了相互矛盾的结果

时间:2009-12-09 10:00:08

标签: jquery

我在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!

任何人都可以对此有所了解吗?

谢谢:)

3 个答案:

答案 0 :(得分:1)

错误部分来自您使用nextAll()查找当前元素之后的所有兄弟元素”。因此,您始终选择跟随当前行的所有可见行。

如果您重读有关它们的文档,可以解释attr()hasClass()返回的值之间的差异

  

attr(姓名)

     

访问该地产   第一个匹配的元素。

VS

  

hasClass(class)

     

如果指定的类是,则返回true   出现在至少一组中   匹配的元素。

这解释了一切。您使用选择多个兄弟姐妹的nextAllattr仅显示匹配的第一个元素的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()获取不同类的原因是它返回选择器的第一个元素。

..弗雷德里克