原生强大的DOM选择器querySelector详细介绍(代码附上)

这篇文章主要介绍了原生的强大dom选择器queryselector一些相关知识,需要的朋友可以参考下

在传统的 JavaScript 开发中,查找 DOM 往往是开发人员遇到的第一个头疼的问题,原生的 JavaScript 所提供的 DOM 选择方法并不多,仅仅局限于通过 tag, name, id 等方式来查找,这显然是远远不够的,如果想要进行更为精确的选择不得不使用看起来非常繁琐的正则表达式,或者使用某个库。事实上,现在所有的浏览器厂商都提供了 querySelector 和 querySelectorAll 这两个方法的支持,甚至就连微软也派出了 IE 8 作为支持这一特性的代表,querySelector 和 querySelectorAll 作为查找 DOM 的又一途径,极大地方便了开发者,使用它们,你可以像使用 CSS 选择器一样快速地查找到你需要的节点。

querySelector 和 querySelectorAll 的使用非常的简单,就像标题说到的一样,它和 CSS 的写法完全一样,对于前端开发人员来说,这是难度几乎为零的一次学习。假如我们有一个 id 为 test 的 p,为了获取到这个元素,你也许会像下面这样:

document.getElementById(“test”);
现在我们来试试使用新方法来获取这个 p:

document.querySelector("#test");document.querySelectorAll("#test")[0];

登录后复制

下面是个小演示:

我是 id 为 test 的 p

感觉区别不大是吧,但如果是稍微复杂点的情况,原始的方法将变得非常麻烦,这时候 querySelector 和 querySelectorAll 的优势就发挥出来了。比如接下来这个例子,我们将在 document 中选取 class 为 test 的 p 的子元素 p 的第一个子元素,当然这很拗口,但是用本文的新方法来选择这个元素,比用言语来描述它还要简单。

document.querySelector("p.test>p:first-child");document.querySelectorAll("p.test>p:first-child")[0];

登录后复制

下面是个小演示:

我是层里的 p 标签

现在应该对于 querySelector、querySelectorAll 方法中的参数已经非常明白了,是的,它接收的参数和 CSS 选择器完全一致。querySelector 和 querySelectorAll 的区别在于 querySelector 用来获取一个元素,而querySelectorAll 可以获取多个元素。querySelector 将返回匹配到的第一个元素,如果没有匹配的元素则返回 Null。querySelectorAll 返回一个包含匹配到的元素的数组,如果没有匹配的元素则返回的数组为空。在本文最后一个例子中,我们使用 querySelectorAll 给所有 class 为 emphasis 的元素加粗显示。

var emphasisText = document.querySelectorAll(".emphasis");for( var i = 0 , j = emphasisText.length ; i 

这是原生方法,比起jquery速度快,缺点是IE6、7不支持。

W3C的规范与库中的实现

querySelector:return the first matching Element node within the node's 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 node's 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 ),浏览器的实现就有点奇怪了,举个例子:

    

Test

   var testElement= document.getElementById( 'testId' ); var element = testElement.querySelector( '.test span' ); var elementList = document.querySelectorAll( '.test span' ); console.log(element); // Test console.log(elementList); // 1

登录后复制

按照W3C的来理解,这个例子应该返回:element:null;elementList:[];因为作为baseElement的 testElement里面根本没有符合selectors的匹配子节点;但浏览器却好像无视了baseElement,只在乎selectors,也就是说此时baseElement近乎document;这和我们的预期结果不合,也许随着浏览器的不断升级,这个问题会得到统一口径!

人的智慧总是无穷的,Andrew Dupont发明了一种方法暂时修正了这个怪问题,就是在selectors前面指定baseElement的id,限制匹配的范围;这个方法被广泛的应用在各大流行框架中;

Jquery的实现:

var  oldContext = context,old = context.getAttribute( "id"  ),nid = old || id,

登录后复制

try  {if  ( !relativeHierarchySelector || hasParent ) {   return  makeArray( context.querySelectorAll( "[id='"  + nid + "'] "  + query ), extra ); }  } catch (pseudoError) {} finally {if  ( !old ) { oldContext.removeAttribute( "id"  );}}

登录后复制

先不看这点代码中其他的地方,只看他如何实现这个方法的;这点代码是JQuery1.6的片段;当baseElement没有ID的时候,给他设置一个id = "__sizzle__”,然后再使用的时候加在selectors的前面,做到范围限制;context.querySelectorAll( "[id='" + nid + "'] " + query ;最后,因为这个ID本身不是baseElement应该有的,所以,还需要移除:oldContext.removeAttribute( "id" ); ,Mootools的实现:

var  currentId = _context.getAttribute( 'id' ), slickid = 'slickid__' ;_context.setAttribute( 'id' , slickid);_expression = '#'  + slickid + ' '  + _expression;context = _context.parentNode;

登录后复制

Mootools和Jquery类似:只不过slickid = 'slickid__';其实意义是一样的;方法兼容性:FF3.5+/IE8+/Chrome 1+/opera 10+/Safari 3.2+;IE 8 :不支持baseElement为object;

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

Node.Js实现端口重用步骤详解

js继承中的方法重写重点讲解

js方法的重写和重载的技巧详解

以上就是原生强大的DOM选择器querySelector详细介绍(代码附上)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2760855.html

(0)
上一篇 2025年3月8日 09:24:59
下一篇 2025年3月8日 09:25:36

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Es6 写的文件import解决方案(详细解读)

    这篇文章主要介绍了如何让es6 写的文件import 起来详解的相关资料,需要的朋友可以参考下 这段时间,学习了一点关于es6新规范的知识,然后心血来潮,想尝试一下用ES6编写的代码在浏览器中跑起来。 先说下我的实现步骤 把ES6代码转译成…

    2025年3月8日 编程技术
    200
  • Javascript 事件冒泡机制详细介绍(图文教程)

    这篇文章主要介绍了javascript 事件冒泡机制详细介绍的相关资料,需要的朋友可以参考下 1. 事件          在浏览器客户端应用平台,基本生都是以事件驱动的,即某个事件发生,然后做出相应的动作。          浏览器的事件…

    2025年3月8日 编程技术
    200
  • 对Js OOP编程 创建对象的详细解读

    下面我就为大家带来一篇对js oop编程 创建对象的一些全面理解。现在就分享给大家,也给大家做个参考。 面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。 对象的含义 对象可以是汽车,人,动物,文字,表单或者…

    编程技术 2025年3月8日
    200
  • 关于JS 预解释的详细解读

    下面我就为大家带来一篇关于js 预解释的相关理解。现在就分享给大家,也给大家做个参考。 1、JS中的内存空间分为两种:栈内存、堆内存 栈内存:提供JS代码执行的环境;存储基本数据类型的值; ->全局作用域或者私有的作用域其实都是栈内存…

    编程技术 2025年3月8日
    200
  • 全面为你分析js选择器(基础教程)

    下面我就为大家带来一篇js选择器全面解析。现在就分享给大家,也给大家做个参考。 原生JS选择器有getElementById、getElementsByName、getElementsByTagName和getElementsByClass…

    编程技术 2025年3月8日
    200
  • jQuery元素选择器使用案例详解

    这次给大家带来jQuery元素选择器使用案例详解,jQuery元素选择器使用的注意事项有哪些,下面就是实战案例,一起来看一下。 本文实例讲述了jQuery中元素选择器(element)简单用法。分享给大家供大家参考,具体如下: 一、介绍 元…

    2025年3月8日
    200
  • VUE中地区选择器组件使用详解

    这次给大家带来VUE中地区选择器组件使用详解,VUE中地区选择器组件使用的注意事项有哪些,下面就是实战案例,一起来看一下。 废话不多说,直接进入正题。 安装,引用,这些直接从官网拷贝来的,就不多说了。 1、安装 使用 npm 安装: npm…

    编程技术 2025年3月8日
    200
  • CSS选择器使用方法总结

    这次给大家带来CSS选择器使用方法总结,CSS选择器使用的注意事项有哪些,下面就是实战案例,一起来看一下。 CSS选择器 1.id选择器 #id{ } ,“#id”选中元素2.类选择器 .class{ } ,“.类名称”选中元素3.标签选择…

    2025年3月8日
    200
  • 怎么使用jQuery复合选择器

    这次给大家带来怎么使用jQuery复合选择器,使用jQuery复合选择器的注意事项有哪些,下面就是实战案例,一起来看一下。 一 介绍 复合选择器将多个选择器(可以是ID选择器、元素选择或是类名选择器)组合在一起,两个选择器之间以逗号“,”分…

    2025年3月8日
    200
  • jQuery中复合选择器简单用法示例

    这篇文章主要介绍了jquery中复合选择器简单用法,结合实例形式分析了jquery中复合选择器的概念、功能、应用场景及相关使用方法,需要的朋友可以参考下 本文实例讲述了jQuery中复合选择器简单用法。分享给大家供大家参考,具体如下: 一 …

    2025年3月8日
    200

发表回复

登录后才能评论