Javascript 在元素中查找元素的更好方法

Javascript 在元素中查找元素的更好方法,javascript,jquery,domdocument,Javascript,Jquery,Domdocument,我正在寻找一种比“查找”更好的方法来查找元素中的所有元素: <table> <tr> <td class="test"> Test </td> </tr> <tr> <td class="test"> Test </td> </tr> <tr> <td class="test">

我正在寻找一种比“查找”更好的方法来查找元素中的所有元素:

<table>
  <tr>
    <td class="test">
      Test
    </td>
  </tr>
  <tr>
    <td class="test">
      Test
    </td>
  </tr>
  <tr>
    <td class="test">
      Test
    </td>
  </tr>
</table>
查找是一个非常昂贵的电话。我需要一个更好的方法。我知道我可以用这样的直接选择器:

$table.find('.test');
$('table .test');

但我正在寻找一种性能更好的替代方法。Find的性能非常糟糕,尤其是在IE中。

我做了一个jsperf来测试
$('test',$('my#u table'))
vs
$('table.test')


它看起来像是赢了
$('.test',$('#我的表'))是赢家

我做了一个jsperf来测试
$('.test',$('#我的表'))
vs
$('table.test')


看起来,
$('.test',$(“#我的表格”)
是赢家

你能做的最大的事情是改进你正在使用的选择器:

$table.find('td.test');
提供元素名称可以显著加快选择速度。IE9之前的IE版本尤其如此,它缺少
getElementsByClassName
方法


如果您有
getElementsByClassName
,这不会提供显著的改进。但是,如果你不这样做,改进将是巨大的。jQuery必须选择可能匹配的每个元素,然后进行测试以查看是否存在相关的类。如果您提供
td
,它将只测试
td
元素。如果您不这样做,它必须测试每个元素,这显然需要更长的时间。

您能做的最大的事情是改进您正在使用的选择器:

$table.find('td.test');
提供元素名称可以显著加快选择速度。IE9之前的IE版本尤其如此,它缺少
getElementsByClassName
方法


如果您有
getElementsByClassName
,这不会提供显著的改进。但是,如果你不这样做,改进将是巨大的。jQuery必须选择可能匹配的每个元素,然后进行测试以查看是否存在相关的类。如果您提供
td
,它将只测试
td
元素。如果不这样做,它必须测试每个元素,这显然需要更长的时间。

find
在IE中很慢,因为IE没有实现原生的
getElementsByClassName
。最快的解决方案是将DOM结构的知识应用于选择元素的函数。它不太灵活,但始终是最快的解决方案。在这种情况下,看起来只有
test
类的元素是
td

var rows = $table[0].rows, cells, i, j, numRows, numCells, result = [];
for(i = 0, numRows = rows.length; i<numRows; i++) { //Iterate over the table's rows
    cells = rows[i].children;
    for(j = 0, numCells = cells.length; j<numCells; j++) { //Iterate over the cells in the row
        if(cells[j].className == "test") { //Won't be valid if the cells have more than one class
            result.push(cells[j]);
        }
    }
}
var rows=$table[0]。行、单元格、i、j、numRows、numCells、结果=[];

对于(i=0,numRows=rows.length;i
find
在IE中速度较慢,因为IE没有实现原生的
GetElementsByCassName
。最快的解决方案是将DOM结构的知识应用于选择元素的函数。它灵活性较低,但始终是最快的解决方案。在这种情况下,它看起来是唯一的解决方案具有
测试
类的元素为
td

var rows = $table[0].rows, cells, i, j, numRows, numCells, result = [];
for(i = 0, numRows = rows.length; i<numRows; i++) { //Iterate over the table's rows
    cells = rows[i].children;
    for(j = 0, numCells = cells.length; j<numCells; j++) { //Iterate over the cells in the row
        if(cells[j].className == "test") { //Won't be valid if the cells have more than one class
            result.push(cells[j]);
        }
    }
}
var rows=$table[0]。行、单元格、i、j、numRows、numCells、结果=[];
对于(i=0,numRows=rows.length;i我认为如果使用


试验
试验
试验
将尽可能快。

我想如果您使用


试验
试验
试验

将尽可能快。

尝试自己测试它:如果有更好的方法来做find所做的事情,jquery会使用这种方法。为什么你需要这个,而不是使用jquery?我已经尝试过jsperf.com。这是一个非常好的工具。@EmphanticsSunshine永远不要假设IE会表现良好。尝试自己测试它:如果有要做find所做的事情,jquery会使用这种方式。为什么你需要这个,而你不是在使用jquery?我已经试过了jsperf.com。这是一个非常好的工具。@EmphanticSunshine从不认为IE会表现得很好。这种情况毫无意义,一个是你在使用
id
,另一个是你在使用
e> id
将始终比
更重要的是,你没有任何id,因此你什么也得不到。如果.dude…没有$(“#我的_表”),这就不那么正确(事实上,完全错误)因此,它显然会表现得更好。现在试试。谢谢,我想你是对的,我现在就把它修好了。我不认为这是毫无意义的,因为我不会把那些公共知识称为毫无意义的,在一种情况下,你使用的是
id
,而另一种情况下,你只使用
table
id
的性能总是优于
table
。更重要的是,你没有这个ID的任何东西,所以你什么也得不到。如果.dude…没有美元(“#我的桌子”),这就不那么正确(事实上,完全错误)所以它显然会表现得更好…现在就试试吧谢谢,我想你是对的,我现在就把它修好了。我不认为这是毫无意义的,因为我不会称之为公共知识,但在有
gEBCN
(或
querySelectorAll
)的浏览器中这会慢得多。我同意,通常最好让jQuery找到最快的方法。直接dom操作在IE中更快。jQuery选择器使其速度变慢,但在有
gEBCN
(或
querySelectorAll
)的浏览器中这会慢得多。我同意,通常最好让jQuery找到最快的方法。直接dom操作在IE中更快。jQuery选择器会让它更慢