javascript - 关于js的选择器
本文介绍了javascript - 关于js的选择器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
当$(this).parent().parent()==$('.arr').parent()
时你们会选择哪种呢,其实只是举一个例子,在写代码的时候经常会遇到这种多种方式都可以选择到同一元素的情况,哪种效率高点呢,我现在只是知道ID是最快的,然后就是尽量少操作DOM。
解决方案
-
使用选择器,根据选择器的优先级进行查找
id > tag > class > attribute
-
在已经获取了DOM的情况下,优先DOM,例如:
var elemSelector = document.querySelector('#foo'); //bad $('#foo').on(/*do something*/); //good $(elemSelector).on(/* do something*/);
因为传递选择器,jQuery会先查找得到DOM,再包装jQuery对象,而传DOM的话则直接包装jQuery对象。
-
在jQuery中尽可能一次选择到位
比如题主的代码,产生的原理和修正的代码原理大概如下://bad $('#foo').parent().parent().parent(); //大概原理 jQuery( jQuery( jQuery( document.getElementById('foo'))[0].parentElement)[0].parentElement) //good $('#foo').closet('li'); //大概原理 var elem = document.getElementById('foo'); while ((elem = elem.parentElement).tagName !== 'LI');
-
在已经存在的DOM中,使用范围内查找:
//bad var $foo = $('.foo');//#1 var $bar = $('.bar'); //good var $box = $('#box');//#2 var $foo = $box.find('.foo'); var $bar = $box.find('.bar');
上面的代码:
#1的原理是通过浏览器API
getElementsByClassName
直接根据class获取元素,是浏览器从document一层一层查找出来的。#2的是先通过浏览器拿到
#box
,在#box
的基础上通过浏览器APigetElementsByClassName
获取元素,由于限定了查找返回,浏览器会先从直接在该DOM里进行遍历查找。查找范围比#1更小,当然这仍然建立在已有DOM的基础上。
#2的做法比较好的是页面中如果切割成了各个模块,则可以在每个模块内进行DOM查找,一来提升了DOM查找速度,二来这样DOM的模块层次更分明一些,你可以确保你操作的DOM不会和其他模块冲突。
简单的说:
减少DOM查找
在已经获取了DOM的情况下DOM高于选择器
新人谨记,反复使用的jQuery对象,请保存到变量里,而不要每使用一次就查找包装一次jQuery。
这篇关于javascript - 关于js的选择器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文