Javascript 选择类时jQuery选择器速度慢

Javascript 选择类时jQuery选择器速度慢,javascript,jquery,Javascript,Jquery,我有下表 <table> <tr> <td>Name</td> <td>01</td> <td>02</td> <td>03</td> <td>04</td> <td>05</td> </tr> &l

我有下表

<table>
    <tr>
        <td>Name</td>
        <td>01</td>
        <td>02</td>
        <td>03</td>
        <td>04</td>
        <td>05</td>
    </tr>
    <tr>
        <td class="tdName">Smith</td>
        <td class="tdTime" id="td_smith_01">1</td>
        <td class="tdTime" id="td_smith_02">%nbsp;</td>
        <td class="tdTime" id="td_smith_03">1</td>
        <td class="tdTime" id="td_smith_04">%nbsp;</td>
        <td class="tdTime" id="td_smith_05">2</td>
    </tr>
    <tr>
        <td class="tdName">Miller</td>
        <td class="tdTime" id="td_miller_01">%nbsp;</td>
        <td class="tdTime" id="td_miller_02">2</td>
        <td class="tdTime" id="td_miller_03">%nbsp;</td>
        <td class="tdTime" id="td_miller_04">2</td>
        <td class="tdTime" id="td_miller_05">1</td>
    </tr>
    <tr>
        <td class="tdName">Underwood</td>
        <td class="tdTime" id="td_underwood_01">%nbsp;</td>
        <td class="tdTime" id="td_underwood_02">%nbsp;</td>
        <td class="tdTime" id="td_underwood_03">1</td>
        <td class="tdTime" id="td_underwood_04">1</td>
        <td class="tdTime" id="td_underwood_05">%nbsp;</td>
    </tr>
    <tr>
        <td class="tdName">Stinson</td>
        <td class="tdTime" id="td_stinson_01">2</td>
        <td class="tdTime" id="td_stinson_02">2</td>
        <td class="tdTime" id="td_stinson_03">%nbsp;</td>
        <td class="tdTime" id="td_stinson_04">%nbsp;</td>
        <td class="tdTime" id="td_stinson_05">1</td>
    </tr>
</table>
正如我提到的,真正的表要大得多(tdTimes的长度>15000),因此IE需要大约8000ms才能将侦听器添加到每个单元格中,Chrome仍然需要大约3000ms。在许多网站上,建议使用ID作为选择器,以加快速度,但正如您所看到的,我已经使用了ID,在这种情况下,我几乎不可能使用这些ID,因为表要比简单的示例复杂得多

你有什么建议来加快这个过程?在另一篇文章中,我读到了一个给选择器一个上下文的技巧,我是否应该给表行一个连续的id(“trTime1”、“trTime2”、…),然后记住这些行的数量,然后执行for循环来添加侦听器?比如:

for(var i = 1; i <= trTimelength; i++) {
    var tdTimes = $('.tdTime', '#trTime' + i)
    tdTimes.click(
        ...
    )
};

for(var i=1;i不将事件处理程序附加到每个单元格。这非常低效,并且会消耗大量内存

使用事件冒泡功能,并将处理程序附加到更高级别的元素,在本例中,附加到表

试试像这样的东西

$("table#tblid").on("click", "td.tdTime", function(e) { 
    console.log("Td clicked", e);
    console.log(e.target);
});
注:如评论中正确提到的(通过@A.Wolf)下面这不是一次添加所有处理程序的快捷方式。这只会将单个处理程序添加到包含所有td元素的table元素中。table可以看到子td上的click事件,这是因为称为“事件传播”或“事件冒泡”的机制。它使用的资源比添加处理程序少得多,也不容易出错o单个元素。即使您以后动态地将td元素添加到表中,它也可以工作

检查此JSFIDLE:


不要将事件处理程序附加到每个单元格。这非常低效,并且会消耗大量内存

使用事件冒泡功能,并将处理程序附加到更高级别的元素,在本例中,附加到表

试试像这样的东西

$("table#tblid").on("click", "td.tdTime", function(e) { 
    console.log("Td clicked", e);
    console.log(e.target);
});
注:如评论中正确提到的(通过@A.Wolf)下面这不是一次添加所有处理程序的快捷方式。这只会将单个处理程序添加到包含所有td元素的table元素中。table可以看到子td上的click事件,这是因为称为“事件传播”或“事件冒泡”的机制。它使用的资源比添加处理程序少得多,也不容易出错o单个元素。即使您以后动态地将td元素添加到表中,它也可以工作

检查此JSFIDLE:


不要将事件处理程序附加到每个单元格。这非常低效,并且会消耗大量内存

使用事件冒泡功能,并将处理程序附加到更高级别的元素,在本例中,附加到表

试试像这样的东西

$("table#tblid").on("click", "td.tdTime", function(e) { 
    console.log("Td clicked", e);
    console.log(e.target);
});
注:如评论中正确提到的(通过@A.Wolf)下面这不是一次添加所有处理程序的快捷方式。这只会将单个处理程序添加到包含所有td元素的table元素中。table可以看到子td上的click事件,这是因为称为“事件传播”或“事件冒泡”的机制。它使用的资源比添加处理程序少得多,也不容易出错o单个元素。即使您以后动态地将td元素添加到表中,它也可以工作

检查此JSFIDLE:


不要将事件处理程序附加到每个单元格。这非常低效,并且会消耗大量内存

使用事件冒泡功能,并将处理程序附加到更高级别的元素,在本例中,附加到表

试试像这样的东西

$("table#tblid").on("click", "td.tdTime", function(e) { 
    console.log("Td clicked", e);
    console.log(e.target);
});
注:如评论中正确提到的(通过@A.Wolf)下面这不是一次添加所有处理程序的快捷方式。这只会将单个处理程序添加到包含所有td元素的table元素中。table可以看到子td上的click事件,这是因为称为“事件传播”或“事件冒泡”的机制。它使用的资源比添加处理程序少得多,也不容易出错o单个元素。即使您以后动态地将td元素添加到表中,它也可以工作

检查此JSFIDLE:



您应该对表格进行分页。一次显示15000个以上的单元格实在太多了。也就是说,您仍然可以将事件委托给表格级别,避免超过15000个Handlers。那么您是否有多个类似的ID?我猜您的表格中可能有多个Smith?同意。对于表上的3000行,存在可用性问题性能问题之上的一页。不要将侦听器添加到td的父表中,而是添加到它们的父表中。然后将td元素称为evt.target.as@BuddhiP,将事件处理程序附加到要处理的元素。此外,“on”负责动态创建/附加到表中的元素。它是一次性事件委派。你应该给你的表格分页。一次显示超过15000个单元格实在是太多了。也就是说,你仍然可以将事件委托给表格级别,避免超过15000个Handlers。你不是有多个类似的ID吗?我猜你的表格中可以有多个Smith同意。一页上有3000行存在可用性问题除了性能问题之外,不要将侦听器添加到td的父表中。然后将td元素称为evt.target.as@BuddhiP answered,将事件处理程序附加到要处理的元素。此外,“on”负责动态创建/附加到表中的元素。这是一次事件委派。您应该ld为您的表分页。一次显示超过15000个单元格实在是太多了。也就是说,您仍然可以将事件委托给表级别,避免超过15000个句柄。那么您是否有多个类似的ID?我猜您的表中可能有多个史密斯同意。对于顶部一页上3000行的可用性问题性能问题。不要将侦听器添加到td的父表中,而是添加到它们的父表中。然后将td元素称为evt.target.as@BuddhiP answered,将事件处理程序附加到要处理的元素。此外,“On”还负责动态创建/附加到表中的元素。