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