我的 JavaScript 中有这行代码:
for (var row in $('#alertsbody > tr')) {
. . .
}
我需要测试该行的 ID 是否与某个值匹配。然而,
if (row.attr('id') == myRowId) {
. . .
}
生成“TypeError:row.attr 不是函数”错误。
获取行ID的正确方法是什么?
我的 JavaScript 中有这行代码:
for (var row in $('#alertsbody > tr')) {
. . .
}
我需要测试该行的 ID 是否与某个值匹配。然而,
if (row.attr('id') == myRowId) {
. . .
}
生成“TypeError:row.attr 不是函数”错误。
获取行ID的正确方法是什么?
不要使用for..in
循环来遍历 jQuery 集合的元素。for..in
遍历对象的所有属性,而 jQuery 集合有很多属性,其中只有一些是集合的实际元素。使用 jQuery 提供的.each()
函数 -> http://api.jquery.com/each/
旁注,变量row
infor(row in something)
将包含属性名称,而不是属性的值。
在编写它时,您可以使用该each
函数进行迭代,然后 JQuery 在检查 id 之前包装每个元素:
$("#alertsbody > tr").each(function(i, tr) {
if ($(tr).attr('id') == myRowId) {
//do something
}
});
但是,考虑到您要执行的操作,仅获取具有特定 ID 的元素不是更有意义吗?
$(myRowId)
您需要迭代多个元素的唯一时间是通过非唯一属性进行选择,例如class
,即使这样您也可以将其合并到 JQuery 选择器中:
$("#alertsbody > tr."+myRowClass)
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)
...
})
一些替代方法是完全跳过循环并通过id
eg 选择行($('#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 ) )
});