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;ifind
在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选择器会让它更慢