-1

我的 JavaScript 中有这行代码:

for (var row in $('#alertsbody > tr')) {
    . . . 
}

我需要测试该行的 ID 是否与某个值匹配。然而,

if (row.attr('id') == myRowId) {
    . . .
}

生成“TypeError:row.attr 不是函数”错误。

获取行ID的正确方法是什么?

4

3 回答 3

2

不要使用for..in循环来遍历 jQuery 集合的元素。for..in遍历对象的所有属性,而 jQuery 集合有很多属性,其中只有一些是集合的实际元素。使用 jQuery 提供的.each()函数 -> http://api.jquery.com/each/

旁注,变量rowinfor(row in something)将包含属性名称,而不是属性的值。

于 2013-08-16T17:37:19.967 回答
0

在编写它时,您可以使用该each函数进行迭代,然后 JQuery 在检查 id 之前包装每个元素:

$("#alertsbody > tr").each(function(i, tr) {
    if ($(tr).attr('id') == myRowId) {
        //do something
    }
});

但是,考虑到您要执行的操作,仅获取具有特定 ID 的元素不是更有意义吗?

$(myRowId)

您需要迭代多个元素的唯一时间是通过非唯一属性进行选择,例如class,即使这样您也可以将其合并到 JQuery 选择器中:

$("#alertsbody > tr."+myRowClass)
于 2013-08-16T17:39:02.493 回答
0

jQuery 选择器返回一个由 jQuery 对象包裹的元素数组。使用您的代码,row将表示对象的一个​​属性,该属性适用于数字属性;但会破坏所有其他属性(请参阅下文了解为什么这很糟糕)。

同样,不应使用以下内容,但使用您的代码,您将in通过缓存选择器来实现循环构造:

var $tr = $('#alertsbody > tr');
for (var row in $tr) {
    // perform any property validation here
    if (isNaN(row))
       continue;                 // try next property

    // id validation
    if ($tr[row].id == myRowId)
       . . . 
}

警告/更好的选择


这是一个坏主意。这是因为您不应该以这种方式遍历对象,而应该使用.each().

$tr.each(function(){
   if(this.id == myRowId)
      ...
})

选择


一些替代方法是完全跳过循环并通过ideg 选择行($('#myRowId')或者$('tr#myRowId')尽管 tr 不是必需的,因为每个 HTML 页面应该只有一个 id)并执行一些操作。或者,如果您已经有一些循环结构或需要替代检查机制,则可以使用该.is()函数:

var domElement = document.getElementById('myRowId');
var $jqElement = $('#myRowId');

$tr.each(function(){
   var $this = $(this);
   if( $this.is('#myRowId') )
      ...
   if( $this.is( domElement ) )
      ...
   if( $this.is( $jqElement ) )
});
于 2013-08-16T17:44:50.860 回答