我有一个jQuery代码,需要你们的帮助才能提高性能。 HTML:
<div class="mydiv">
<div class="indiv">
<span>
myspan
</span>
<a href="#">
a1
</a>
<a href="#">
a2
</a>
</div>
<table >
..................
</table>
</div>
现在我想知道以下内容。 1.现在使用特定范围的tr,我编码像
var $myrows = $(".mydiv table tr").slice(index);
$($myrows , this).jQueryFunction()
代码工作正常,但我认为$(“。mydiv table tr”)将使浏览器遍历总DOM,所以我应该去 $(“。mydiv table tr”,this).jQueryfunction()//我认为这样可以提高性能,而不是使用var $ myrows。
我认为第二个是好的。
2. $(“。mydiv .indiv a”,this).click(function(event) 这个点击不起作用,如果我删除它会开始工作。为什么?
3.我必须选择一个特定的tr,因为我正在使用
$(“。mydiv table tr:nth-child(特定孩子)”) 有没有更好的方法呢?在这种情况下,它将遍历DOM。 感谢。
答案 0 :(得分:1)
使用:gt(3)
过滤器来获取集合中索引大于3的所有实例:
var $ myrows = $(“。mydiv table tr:gt(”(index-1)+“)”)
它不起作用的原因可能是因为this
与你期望的不同。 this
,您使用它的方式,需要是您的代码的子集,其中包含与您的选择器匹配的任何内容。例如,如果this
不是包含类mydiv
元素的节点,则选择器将不返回任何行。这和写作一样
$(this).find('.mydiv .indiv a');
因此,如果this
是您的.mydiv
,则需要从选择器中删除该部分。 this
完全是另一回事。无论是什么,这都是你的错误来源。找出它是什么,然后你就能找到解决方法。
你这样做的方式很好。
修改强>
我考虑过回去编辑我之前的观点,但我想我只需要在这里做一个全覆盖的修正案。在所有这些问题中,您要处理的是如何仅通过将context
参数作为$
参数传递给$(selector, context);
函数来遍历特定的DOM集。在#2中,您的问题是由传递无效的上下文引起的。如果没有看到更多的代码,无效的上下文是什么,以及应该改变什么。在#1和#3中,您只是在寻找有关如何使用context参数的建议。那么,让我在这里发表一些一般性评论。
语法
$(context).find(selector);
与调用
完全相同$('.indiv a', $('.mydiv')[0])
如果能为你解决问题。
因此$('.mydiv:first').find('.indiv a')
和.mydiv
会产生完全相同的结果,并且它们都会同样快速地执行。您指定在DOM中的jqueryFunction
的第一个实例中执行搜索。请注意,您将始终遍历整个DOM以查找该元素;但是一旦你这样做了,你的搜索范围就会缩小到那个范围内。所以是的,这通常是一个很好的方式,如果你知道这会给你你想要的结果。
当然告诉jQuery在特定节点而不是在整个DOM中寻找某些东西,不仅会改变性能,还会改变你的结果集。所以这是否合适取决于你;只有您对代码有足够的了解才能判断这种方法是否适合您。
如果您想在特定tr
内的所有table
元素的子集上调用var mySpecificTable = $('.mydiv .indiv .table').eq(0);
$(mySpecificTable).find('tr:gt('+(index-1)+')').jqueryFunction();
,您可以使用
find
...或者您可能希望改写的任何其他方式。请注意,$('table:first')
方法适用于 jQuery对象,例如context
返回的>},$('table')[0]
方法适用于 DOM节点例如$('tr:nth-child(3)', myDOMNode)
同样的一般想法适用于你的问题#3; $('tr', myDOMNode').eq(3)
和myQueryObject.find('tr').eq(3)
一样好{{1}}等......
希望能够解决问题。