DOM 的选择器 API
在刚开始的时候,我们只能用 getElementById,getElementsByClassName,getElementsByTagName 这几个 DOM 方法查找 DOM 树中的元素。后来,在 W3C 的选择器 API 标准中[1],提供了 querySelector 和 querySelectorAll 这两个利用 CSS 选择器查找元素的方法。它们的语法如下:
element = document.querySelector(selectors);
elementList = document.querySelectorAll(selectors);
其中,document.querySelector 用于查找第一个符合 CSS 选择器条件的元素,使用深度优先,前序遍历的方法。而 document.querySlectorAll 用于查找所有符合 CSS 选择器条件的元素,返回一个静态的 NodeList 对象。注意不同的是, getElementsByClassName 和 getElementsByTagName 返回的却是一个动态的 HTMLCollection 或 NodeList 对象。也许是这个原因,选择同样的元素时,querySelector 比 getElementsByClassName 和 getElementsByTagName 要慢不少。
类似地,querySelector 和 querySelectorAll 这两个方法也可用于在某元素内部查找符合某选择器条件的子元素。此时的语法相同:
element = baseElement.querySelector(selectors);
elementList = baseElement.querySelectorAll(selectors);
这个 querySelectorAll 方法用于元素时,和 jQuery 的 $baseElement.find(selectors) 是有不同的。前者是在 document 中查找,然后过滤包含于 baseElement 的元素;而后者是直接在 baseElement 中查找元素。
这个选择器 API 标准,Firefox 3.5+,Safari 3.2+,Opera 10+,Chrome 1.0+ 都支持。而 IE 直到 8.0 版本才支持,但由于 IE 8 对大部分 CSS3 选择器都不支持,这个选择器 API 在 IE 8 中的用处就大打折扣了。到了 IE 9 才算基本完整的支持 CSS3 选择器了。
另外,选择器 API 中还有个 matchesSelector 方法,用于检测某个元素是否满足某个选择器。目前,各个主流浏览器对这个方法的支持都需要加上前缀,而且这个方法在最新的标准中已经改名为 matches 了。
参考资料:
[1] W3C - Selectors API Level 1
[2] W3C - Selectors API Level 2
[3] Document.querySelectorAll - Web API reference | MDN[4] document.querySelector - Web API reference | MDN[5] querySelectorAll method (Windows) - MSDN
[6] querySelector method (Windows) - MSDN
[7] Understanding CSS Selectors (Internet Explorer) - MSDN
[8] querySelectorAll vs getElementsByTagName · jsPerf[9] Why is getElementsByTagName() faster than querySelectorAll()?
[A] Live vs. Static Node Lists | Darcy Clarke
[B] Selectors API Test Suite - John Resig
[C] 各浏览器中querySelector和querySelectorAll的实现差异 - snandy[D] 避免将 querySelectorAll 方法与 JQuery 的选择器混淆 - w3ctech
[E] Element.mozMatchesSelector - Web API reference | MDN
[F] Can I use matches() DOM method
DOM 的选择器 API的更多相关文章
- jacascript DOM节点——节点获取与选择器API
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! DOM 操作必须等待 HTML 加载完毕之后,才可以获取节点:有两种方法: 把 script 标签放到代码 ...
- 深入理解javascript选择器API系列第三篇——h5新增的3种selector方法
× 目录 [1]方法 [2]非实时 [3]缺陷 前面的话 尽管DOM作为API已经非常完善了,但是为了实现更多的功能,DOM仍然进行了扩展,其中一个重要的扩展就是对选择器API的扩展.人们对jQuer ...
- 深入理解javascript选择器API系列第三篇——HTML5新增的3种selector方法
前面的话 尽管DOM作为API已经非常完善了,但是为了实现更多的功能,DOM仍然进行了扩展,其中一个重要的扩展就是对选择器API的扩展.人们对jQuery的称赞,很多是由于jQuery方便的元素选择器 ...
- JavaScript实现DOM对象选择器
目的: 根据传入的选择器类型选出第一个符合的DOM对象. ①可以通过id获取DOM对象,例如 $("#adom"); ②可以通过tagName获取DOM对象,例如 $(" ...
- DOM的选择器
这几天学习了DOM的选择器,现在来进行一下总结分类. 1.DOM里的元素节点选择器 元素节点选择器包括id,class,name,tagname,高级,关系. 1.1 id选择器 id:返回的是单个对 ...
- Dom直接选择器
Dom直接选择器 <!DOCTYPE html> <!--Dom间接选择器--> <html lang="en"> <head> & ...
- DOM扩展-Selectors API(选择符 API)、元素遍历
DOM扩展 对DOM的两个主要扩展是SelectorsAPI(选择符API)和HTML5 SelectorsAPI(选择符API)是由W3C发起制定的一个标准,致力于浏览器原生支持CSS查询,Sele ...
- DOM querySelector选择器
原生的强大DOM选择器querySelector 在传统的 JavaScript 开发中,查找 DOM 往往是开发人员遇到的第一个头疼的问题,原生的 JavaScript 所提供的 DOM 选择方法并 ...
- 原生JS中DOM节点相关API合集
节点属性 Node.nodeName //返回节点名称,只读 Node.nodeType //返回节点类型的常数值,只读 Node.nodeValue //返回Text或Comment节点的文本值,只 ...
随机推荐
- MyBatis的动态SQL操作--插入
需求:向数据库中插入一条数据 //id,name,sal非空,三个字段都插入 insert into student(id,name,sal) values (?,?,?) //id,name非空,只 ...
- C# 模拟POST提交文件
http://blog.csdn.net/hellowjwang/article/details/19975635 public class HttpPost { /// <summary> ...
- Django admin site(一)ModelAdmin Options
Admin管理界面是django的杀手级应用.它读取你模式中的元数据,然后提供给你一个强大而且可以使用的界面,网站管理者可以用它立即向网站中添加内容. 要使用admin,可以按照下面的步骤: 将'dj ...
- clone函数
http://blog.csdn.net/caianye/article/details/5947282 http://wenku.baidu.com/link?url=qnq7laYDYm1V8tl ...
- Windows平台下的session0创建进程的问题与解决办法
很多博客都有记载如何在session0下创建进程的办法,也就是使用CreateProcessAsUser.但是这个要求服务的进程有SE_INCREASE_QUOTA_NAME和SE_ASSIGNPRI ...
- 在XML里的XSD和DTD以及standalone的使用2----具体使用详解
如何定义XSD并在XML中使用XSD 同时XSD可以对XML中的格式进行约束,当约束失败时给出提示. 下面以下使用VS2010为平台进行演示. 1.新建一个项目,然后在项目中添加xml架构文件(.xs ...
- C#.Net 如何动态加载与卸载程序集(.dll或者.exe)4-----Net下的AppDomain编程 [摘录]
最近在对AppDomain编程时遇到了一个问题,卸载AppDomain后,在内存中还保留它加载的DLL的数据,所以即使卸载掉AppDomain,还是无法更新它加载的DLL.看来只有关闭整个进程来更新D ...
- Lua从入门到精通
1. 入门指南 http://www.cnblogs.com/linbc/archive/2009/06/02/1494622.html
- poj 2676 Sudoku ( dfs )
dfs 用的还是不行啊,做题还是得看别人的博客!!! 题目:http://poj.org/problem?id=2676 题意:把一个9行9列的网格,再细分为9个3*3的子网格,要求每行.每列.每个子 ...
- poj 2253 Frogger(最短路 floyd)
题目:http://poj.org/problem?id=2253 题意:给出两只青蛙的坐标A.B,和其他的n-2个坐标,任一两个坐标点间都是双向连通的.显然从A到B存在至少一条的通路,每一条通路的元 ...