jQuery每个tr.children在Firefox 3.0中都是未定义的

我有一段代码,我正在使用它来过滤表中的行。 它在除Firefox v3.0.x之外的所有浏览器中都能完美运行(适用于3.1 beta 2)。 当我在Firefox 3.0.x中运行代码片段时,它表示children is undefined 。 我也在使用jQuery v1.2.6。

代码片段:

 var bodyRows = $("#resultsTable tbody tr"); bodyRows.each(function(n){ if(!filterPattern.test($.trim(this.children[2].innerHTML))){ //errors here this.style.display = 'none'; } else { this.style.display = ''; } }); 

代码选择所有表行,然后遍历它们,测试第3列的innerHTML文本。 如果RegEx测试失败,则隐藏该行,否则显示该行。

有没有人看过这个问题和/或知道如何使它工作?

谢谢

编辑:这是表格的HTML标记。 为了简洁起见,我只提供了2条记录,尽管有更多的记录。

 
First Last City State Zip Email  
James Eggers SomeCity IA 55555 email@email.com  
John Doe SomeCity KY 88888 email2@email.com  

为什么不使用jQuery来遍历DOM元素。

 var bodyRows = $("#resultsTable tbody tr"); bodyRows.each(function(){ var thirdCell = $(this).find('td').eq(2); if(!filterPattern.test($.trim(thirdCell.html()))){ this.style.display = 'none'; } else { this.style.display = ''; } }); 

如果您只想返回没有任何可能标记的文本,也可以使用’ .text() ‘。

属性children是IE唯一的DOM属性,没有其他浏览器(据我所知)。 Firefox使用标准属性childNodes来访问子级。 childNodes的问题在于它认为空白和文本是一个节点(或者至少是Firebug所说的),这使得它(在我看来)很难处理。 如果你有一个JavaScript API,你应该利用它,这样你就不必处理浏览器的DOM遍历技术之间的差异。

 if(!filterPattern.test($.trim(this.children[2].innerHTML))) 

当jQuery调用’each’回调时,’this’是直接浏览器DOM节点,而不是jQuery对象。

之所以出现混淆,是因为jQuery在其DOM包装器上提供了’children’方法,IE在其原生DOM节点上提供了非标准的’children’集合,但这两个接口几乎完全不兼容。

因此,对于jQuery版本使用$(this).children()[2]或类似,或者对标准DOM版本使用this.getElementsByTagName(’td’)[2]。

(假设你打算让表数据元素’td’而不是’th’,你可能会这样做。你也可能想要获取单元格的原始文本而不是innerHTML版本,这可能会以意想不到的方式转义字符。 )

您可能想要在尝试访问第三个元素之前检查子元素的数量。

你明确添加了吗?

  ...  

标记到你的桌子? 如果没有,我会说放弃’tbody’部分:$(“#resultsTable tbody tr”);

只需$(“#resultsTable tr”);

我很好奇这个版本的Firefox是不是暗中为你创建的。