Javascript 本机Jquery选择器与缓存对象.find()的比较
我的程序员们,我正在失去理智。我读过很多关于JS性能的书,他们都说,最好缓存DOM对象以备将来引用和管理,而不要创建新的Jquery对象。听起来很合理。 但现在我的信念正在动摇。我试图在我的公司开发代码约定,我打算从性能的角度来解决这个问题。 我有一段代码如下:Javascript 本机Jquery选择器与缓存对象.find()的比较,javascript,jquery,performance,Javascript,Jquery,Performance,我的程序员们,我正在失去理智。我读过很多关于JS性能的书,他们都说,最好缓存DOM对象以备将来引用和管理,而不要创建新的Jquery对象。听起来很合理。 但现在我的信念正在动摇。我试图在我的公司开发代码约定,我打算从性能的角度来解决这个问题。 我有一段代码如下: $("#registratorType").attr("readonly", "readonly"); $("#registratorType").attr("size", "25");
$("#registratorType").attr("readonly", "readonly");
$("#registratorType").attr("size", "25");
$("#id").attr("readonly", "readonly");
$("#id").attr("size", "25");
$("#serial").attr("readonly", "readonly");
$("#serial").attr("size", "25");
$("#duration").attr("size", "25");
$("#stoppingDuration").attr("size", "25");
$("#speeddata").removeAttr("disabled");
这不是全部,但我认为,你有这个想法。我打算得到所有这些表单,并将其包装在缓存引用中
var $form = $('#vehicleProfile');
$form.find("#registratorType").attr("readonly", "readonly");
$form.find("#registratorType").attr("size", "25");
$form.find("#id").attr("readonly", "readonly");
$form.find("#id").attr("size", "25");
$form.find("#serial").attr("readonly", "readonly");
$form.find("#serial").attr("size", "25");
$form.find("#duration").attr("size", "25");
$form.find("#stoppingDuration").attr("size", "25");
$form.find("#speeddata").removeAttr("disabled");
我已经在最新的chrome上测试了性能,感到震惊!我的方法失败了3-4次。我的意思是我的函数运行时间是42毫秒,而旧的是12-14毫秒。
我的方法真的有价值吗?我的方法是反模式的吗?请帮帮我 由于您所有的选择器都是id选择器,因此速度相当快(
document.getElementById
是一种O(1)
表格查找)。但是,使用find()
将它们限制在某个父元素中,这就需要进行DOM树搜索,这显然是一个缓慢的过程
“缓存DOM对象以备将来引用”意味着您永远不会应用同一选择器两次。执行一次,并将其存储在变量中(就像使用$form
)。所以不是
$("#id").attr("readonly", "readonly");
$("#id").attr("size", "25");
应该是
var $id = $("#id");
$id.attr("readonly", "readonly");
$id.attr("size", "25");
因为,上述内容也可以写成
$("#id").attr("readonly", "readonly").attr("size", "25");
顺便说一句,您实际上似乎想要使用,并且这些函数也接受:
由于您的所有选择器都是id选择器,因此它们的速度相当快(
document.getElementById
是一种O(1)
表格查找)。但是,使用find()
将它们限制在某个父元素中,这就需要进行DOM树搜索,这显然是一个缓慢的过程
“缓存DOM对象以备将来引用”意味着您永远不会应用同一选择器两次。执行一次,并将其存储在变量中(就像使用$form
)。所以不是
$("#id").attr("readonly", "readonly");
$("#id").attr("size", "25");
应该是
var $id = $("#id");
$id.attr("readonly", "readonly");
$id.attr("size", "25");
因为,上述内容也可以写成
$("#id").attr("readonly", "readonly").attr("size", "25");
顺便说一句,您实际上似乎想要使用,并且这些函数也接受:
因为您正在通过元素的ID查找元素。所有浏览器都有一个getElementById,这是获取元素的最有效方法
使用类标识的元素重试基准测试。因为您是通过它们的ID查找元素的。所有浏览器都有一个getElementById,这是获取元素的最有效方法
用类标识的元素重试基准测试。这不是“缓存引用”的意思。我认为在
find()
中的ID选择器中使用它是无用的,您应该做的是类似var$registorType=$('#registorType');[…]
缓存查找,如var registortype=$(“#registortype”)
然后使用registratorType.attr()
,因为registratorType
变量是一个jQuery对象,这不是“缓存引用”的意思。我认为在find()
中的ID选择器中使用它是没有用的,您应该做的事情类似于var$registratorType=$(“#registratorType”);[…]
缓存查找,如var registortype=$(“#registortype”)
然后使用registratorType.attr()
作为jQuery对象的registratorType
变量,您还可以将映射传递到.attr()
一次设置多个属性:$(“#id”).attr({“readonly”:“readonly”,“size”:“25”)代码>(如果在包含多个元素的jQuery对象上使用,这会明显提高性能)。因此,底线是,除了DOM树的丑陋之外,通过id对元素进行寻址没有其他缺点,除了那些名称被保留,不能在DOM树中使用。例如,如果我在页面上有两个类似的表单,我就可以在ID前面加上前缀,从而获得更好的性能?@user1929437:可能是的。但是,如果您正确地进行缓存(将对DOM元素的引用存储在变量中),以便在整个应用程序运行时只进行一次DOM选择,您将不会注意到它。您还可以将映射传递到.attr()
以一次设置多个属性:$(“#id”).attr({“readonly”:“readonly”,“size”:“25”})代码>(如果在包含多个元素的jQuery对象上使用,这会明显提高性能)。因此,底线是,除了DOM树的丑陋之外,通过id对元素进行寻址没有其他缺点,除了那些名称被保留,不能在DOM树中使用。例如,如果我在页面上有两个类似的表单,我就可以在ID前面加上前缀,从而获得更好的性能?@user1929437:可能是的。但是,如果您正确地进行缓存(在变量中存储对DOM元素的引用),以便在整个应用程序运行时只进行一次DOM选择,您将不会注意到它。因此,底线是除了DOM树的丑陋之外,没有其他缺点,在通过id对元素进行寻址时,这些名称以外的元素被保留,不能在DOM树中使用。例如,如果我在页面上有两个相似的表单,我可以在ID前面加上前缀,从而获得更好的性能?理论上是的,我读到一些浏览器在500个不同的ID后性能会下降,但我从来没有坐过或亲自尝试过。所以底线是,除了DOM树的丑陋之外,没有其他缺点,在通过id对元素进行寻址时,这些名称以外的元素被保留,不能在DOM树中使用。例如,如果我在页面上有两个类似的表单,我可以在ID前面加上前缀,从而获得更好的性能?理论上是的,我读到一些浏览器在500个不同的ID后性能会下降,但我自己从未尝试过。