JS原生的强大DOM选择器querySelector.docx_第1页
JS原生的强大DOM选择器querySelector.docx_第2页
JS原生的强大DOM选择器querySelector.docx_第3页
JS原生的强大DOM选择器querySelector.docx_第4页
JS原生的强大DOM选择器querySelector.docx_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在传统的 JavaScript 开发中,查找 DOM 往往是开发人员遇到的第一个头疼的问题,原生的 JavaScript 所提供的 DOM 选择方法并不多,仅仅局限于通过 tag, name, id 等方式来查找,这显然是远远不够的,如果想要进行更为精确的选择不得不使用看起来非常繁琐的正则表达式,或者使用某个库。事实上,现在所有的浏览器厂商都提供了 querySelector 和 querySelectorAll 这两个方法的支持,甚至就连微软也派出了 IE 8 作为支持这一特性的代表,querySelector 和 querySelectorAll 作为查找 DOM 的又一途径,极大地方便了开发者,使用它们,你可以像使用 CSS 选择器一样快速地查找到你需要的节点。querySelector 和 querySelectorAll 的使用非常的简单,就像标题说到的一样,它和 CSS 的写法完全一样,对于前端开发人员来说,这是难度几乎为零的一次学习。假如我们有一个 id 为 test 的 DIV,为了获取到这个元素,你也许会像下面这样:view source print?1document.getElementById(test);现在我们来试试使用新方法来获取这个 DIV:view source print?1document.querySelector(#test); 2document.querySelectorAll(#test)0;下面是个小演示:我是 id 为 test 的 div感觉区别不大是吧,但如果是稍微复杂点的情况,原始的方法将变得非常麻烦,这时候 querySelector 和 querySelectorAll 的优势就发挥出来了。比如接下来这个例子,我们将在 document 中选取 class 为 test 的 div 的子元素 p 的第一个子元素,当然这很拗口,但是用本文的新方法来选择这个元素,比用言语来描述它还要简单。view source print?1document.querySelector(div.testp:first-child); 2document.querySelectorAll(div.testp:first-child)0;下面是个小演示:我是层里的 p 标签现在应该对于 querySelector、querySelectorAll 方法中的参数已经非常明白了,是的,它接收的参数和 CSS 选择器完全一致。querySelector 和 querySelectorAll 的区别在于 querySelector 用来获取一个元素,而querySelectorAll 可以获取多个元素。querySelector 将返回匹配到的第一个元素,如果没有匹配的元素则返回 Null。querySelectorAll 返回一个包含匹配到的元素的数组,如果没有匹配的元素则返回的数组为空。在本文最后一个例子中,我们使用 querySelectorAll 给所有 class 为 emphasis 的元素加粗显示。view source print?1var emphasisText = document.querySelectorAll(.emphasis); 2for( var i = 0 , j = emphasisText.length ; i j ; i+ ) 3emphasisTexti.style.fontWeight = bold; 4这是原生方法,比起jquery速度快,缺点是IE6、7不支持。W3C的规范与库中的实现querySelector:return the first matching Element node within the nodes subtrees. If there is no such node, the method must return null .(返回指定元素节点的子树中匹配selector的集合中的第一个,如果没有匹配,返回null)querySelectorAll:return a NodeList containing all of the matching Element nodes within the nodes subtrees, in document order. If there are no such nodes, the method must return an empty NodeList. (返回指定元素节点的子树中匹配selector的节点集合,采用的是深度优先预查找;如果没有匹配的,这个方法返回空集合)这在BaseElement 为document的时候,没有什么问题,各浏览器的实现基本一致;但是,当BaseElement 为一个普通的dom Node的时候(支持这两个方法的dom Node ),浏览器的实现就有点奇怪了,举个例子:view source print?01 02Test 03 04 05var testElement= document.getElementById( testId ); 06var element = testElement.querySelector( .test span ); 07var elementList = document.querySelectorAll( .test span ); 08console.log(element); / Test 09console.log(elementList); / 1 10按照W3C的来理解,这个例子应该返回:element:null;elementList:;因为作为baseElement的 testElement里面根本没有符合selectors的匹配子节点;但浏览器却好像无视了baseElement,只在乎selectors,也就是说此时baseElement近乎document;这和我们的预期结果不合,也许随着浏览器的不断升级,这个问题会得到统一口径!人的智慧总是无穷的,Andrew Dupont发明了一种方法暂时修正了这个怪问题,就是在selectors前面指定baseElement的id,限制匹配的范围;这个方法被广泛的应用在各大流行框架中;Jquery的实现:view source print?1var oldContext = context, 2old = context.getAttribute( id ), 3nid = old | id,view source print?01try 02if ( !relativeHierarchySelector | hasParent ) 03return makeArray( context.querySelectorAll( id= + nid + + query ), extra ); 04 05 06catch (pseudoError) 07finally 08if ( !old ) 09oldContext.removeAttribute( id ); 10 11先不看这点代码中其他的地方,只看他如何实现这个方法的;这点代码是JQuery1.6的片段;当baseElement没有ID的时候,给他设置一个id = _sizzle_”,然后再使用的时候加在selectors的前面,做到范围限制;context.querySelectorAll( id= + nid + + query ;最后,因为这个ID本身不是baseElement应该有的,所以,还需要移除:oldContext.removeAttribute( id ); ,Mootools的实现:view source print?1var currentId = _context.getAttribute( id ), slickid = slickid_ ; 2_context.setAttribute( id , slickid); 3_expression = # + slickid + + _expression; 4context = _context.parentNode;Mootools和Jquery类似:只不过slickid = slickid_;其实意义是一样的;方法兼容性:FF3.5+/IE8+/Chrome 1+/opera 10+/Safari 3.2+;IE 8 :不支持baseElement为object;querySelector()方法接受一个CSS查询并返回匹配模式的第一个子孙元素,如果没有匹配的元素则返回null。请看下面的例子:/获取body元素var body = document.querySelector(body);/获取ID为myDiv的元素var myDiv = document.querySelecotr(#myDiv);/获取第一个包含类selected的元素var selected = document.querySelector(.selected);/获取第一个包含类button的图像元素var img = document.body.querySelector(img.button);当querySelector()方法应用Document类型上时,它会尝试从文档元素开始匹配模式。如果应用与Element类型,查询则只会尝试从该元素的子孙节点中寻找匹配。CSS查询可以根据需要复杂化或简单化。如果查询中有语法错误或者有不支持选择器,那么querySelector()或抛出一个错误。querySelector()方法还接受可选的第二个参数,它是一个命名空间解析器,就是一个接受一个命名空间前缀并返回其相关URI的函数,类似于:var nsresolver = function (prefix) switch (prefix) case w3cmm: return ; /此处其它代码 ;命名空间解析器对于在嵌入了其它语言诸如SVG或MathML的XHTML文档中执行查询非常有用,XML文档亦如此。CSS查询中的命名空间是使用一个管道来指定的,如下:var svgImage = document.querySelector(svg|svg, function (prefix) swit

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论