querySelector 和 querySelectorAll 方法是 W3C Selectors API 规范中定义的。他们的作用是根据 CSS 选择器规范,便捷定位文档中指定元素。

目前几乎主流浏览器均支持了他们。包括 IE8(含) 以上版本、 Firefox、 Chrome、Safari、Opera。

querySelector 和 querySelectorAll 在规范中定义了如下接口:

module dom { [Supplemental, NoInterfaceObject] interface NodeSelector { Element querySelector(in DOMString selectors); NodeList querySelectorAll(in DOMString selectors); }; Document implements NodeSelector; DocumentFragment implements NodeSelector; Element implements NodeSelector; };

从接口定义可以看到Document、DocumentFragment、Element都实现了NodeSelector接口。即这三种类型的元素都拥有者两个方法。querySelector和querySelectorAll的参数须是符合 css selector 的字符串。不同的是querySelector返回的是一个对象,querySelectorAll返回的一个集合(NodeList)。

在css中對特定的元素設置樣式離不開選擇符的使用,現在一些大的 javascript 框架 也常用選擇符來獲取特定的元素,如jQuery。W3c規範定義了兩個新的方法(querySelector 和 querySelectorAll) 來獲取元素節點,這兩個方法都接受選擇符作為自己的參數。Nicholas在他的《High Performance JavaScript》一書中對這兩個方法作了簡要介紹,並對其性能作了比較,與傳統獲取元素節點的方法相比,其性能明顯偏優。讓我們從下面這個例子說 起。

<table id="score"><thead><tr><th>Test</th><th>Result</th></tr></thead><tfoot><tr><th>Average   </th><td>82%</td>
</tr>
</tfoot><tbody><tr><td>A</td><td>87%</td></tr><tr><td>A</td><td>87%</td></tr><tr><td>A</td><td>87%</td></tr>…</tbody>
</table>

上面的1000行表格中,要獲取每行包含成績的單元格,傳統意義上,我們使用以下的方法:

var table = document.getElementById("score");
var groups = table.tBodies;
var rows = null;
var cells = [];for (var i = 0; i < groups.length; i++) {rows = groups[i].rows;for (var j = 0; j < rows.length; j++) {cells.push(rows[j].cells[1]);}
}

使用w3c提供的新方法,僅一行代碼即可完成任務,而且速度很快。

var cells = document.querySelectorAll("#score>tbody>tr>td:nth-of-type(2)");

我們可以使用《javascript設計模式》一書中提供的一個「方法性能分析器」來比較這兩個方法的性能,方法如下:

var MethodProfiler = function(component) {this.component = component;this.timers = {};this.log = document.createElement("ul");var body = document.body;body.insertBefore(this.log,body.firstChild);for(var key in this.component) {// Ensure that the property is a function.if(typeof this.component[key] !== 'function') {continue;}// Add the method.var that = this;(function(methodName) {that[methodName] = function() {that.startTimer(methodName);var returnValue = that.component[methodName].apply(that.component,arguments);that.displayTime(methodName, that.getElapsedTime(methodName));return returnValue;};})(key); }
};
MethodProfiler.prototype = {startTimer: function(methodName) {this.timers[methodName] = (new Date()).getTime();},getElapsedTime: function(methodName) {return (new Date()).getTime() - this.timers[methodName];},displayTime: function(methodName, time) {var li = document.createElement("li");var text = document.createTextNode(methodName + ': ' + time + ' ms');li.appendChild(text);this.log.appendChild(li);}
};

然後將這兩個方法寫入一個對象之中,並用性能分析器對它們進行比較.

var obj = {getElementByTradition:function(){var table = document.getElementById("score");var groups = table.tBodies;var cells = [];for (var i = 0; i < groups.length; i++) {rows = groups[i].rows;for (var j = 0; j < rows.length; j++) {                    cells.push(rows[j].cells[1]);             }             }       },      querySelectorAll:function(){                    var cells = document.querySelectorAll("#score>tbody>tr>td:nth-of-type(2)");}
}
var obj = new MethodProfiler(obj);
obj.getElementByTradition();
obj.querySelectorAll();

查看示例,我們很清楚的看到,新的方法不僅使用簡單,而且性能明顯優於我們傳統的方法。注意,儘管IE8已經支持這些方法,但是IE8並不支持nth-of-type()選擇器(詳情可參考Compatibility table: CSS3 Selectors),所以在IE8中會拋出錯誤信息。

當調用document.querySelectorAll()方法時,將返回節點數種的第一個元素節點,如果沒有匹配的節點,將返回null,如:

<div id="fooid="><p class="id"="warningid=">This is a sample warning</p><p class="id"="errorid=">This is a sample error</p></div><div id=id="barid="><p>...</p></div>

使用上面的html,調用以下方法將返回id屬性為foo的元素。

var obj = document.querySelector("#foo, #bar");
alert(obj.innerHTML);//foo

如果去掉id屬性為foo的元素,調用上面的方法將返回:bar。該方法按照參數中傳遞的選擇符進行查找,如果找到則終止並返回該元素,否則返回null。

調用document.querySelectorAll()方法將按順序返回包含在節點樹中所有匹配的元素,如:

var res = document.querySelectorAll("p.warning, p.error");

上面的res中將選澤文檔中class為「error」或「warning」的所有p元素。

转载于:https://www.cnblogs.com/zhepama/archive/2013/05/31/3110132.html

javascript的dom选择器相关推荐

  1. Javascript操作DOM常用API总结

    文本整理了javascript操作DOM的一些常用的api,根据其作用整理成为创建,修改,查询等多种类型的api,主要用于复习基础知识,加深对原生js的认识. 基本概念 在讲解操作DOM的api之前, ...

  2. JavaScript及jQuery选择器(二)

    1.选择指定ID元素 对于选择DOM元素,javascript提供了以下两个方法: document.getElementById(): document.getElementsByTagName() ...

  3. 【repost】Javascript操作DOM常用API总结

    Javascript操作DOM常用API总结 文本整理了javascript操作DOM的一些常用的api,根据其作用整理成为创建,修改,查询等多种类型的api,主要用于复习基础知识,加深对原生js的认 ...

  4. JavaScript中DOM操作

    Web前端基础修炼 HTML基本标签详解与运行截图 CSS基本操作详解及截图演示 JavaScript基础(ECMAScript) JavaScript中DOM操作 JavaScript中BOM操作 ...

  5. JavaScript 之 DOM中的三大对象

    下面是对JavaScript DOM中三大对象的整理,希望可以帮助到有需要的小伙伴. JavaScript 之 DOM中的三大对象 一.Document对象 1.Document对象是什么 Docum ...

  6. JavaScript中DOM对象的详解

    *** JavaScript中DOM对象的详解*** DOM对象:Document Object Model,文档对象模型.也称为document(文档对象),是HTML页面当前窗体的内容,是连接JS ...

  7. JavaScript的DOM知识点总结

    目录 1.DOM重点核心 2.DOM事件流 3.DOM知识点总结 4.常见案例 视频资料,pink老师讲的超级详细,JavaScript的DOM操作:黑马程序员JavaScript核心教程,前端基础教 ...

  8. JavaScript之DOM学习笔记

    目录 1.DOM简介 1.1.什么是DOM 2.获取元素 2.1.如何获取页面元素 2.2.根据ID获取 2.3.根据标签名获取 2.4.通过H5新增方法获取 3.事件基础 3.1.事件概述 3.2. ...

  9. JavaScript 的DOM对象

    JavaScript 的DOM对象 1.DOM对象的概念 1.DOM:文档对象模型(Document Object Model) 2.document对象,是DOM中的顶级对象,封装了HTML的相关属 ...

  10. keras 香草编码器_用香草javascript遍历dom

    keras 香草编码器 If you're new to JavaScript, you're likely starting out with Vanilla JavaScript in order ...

最新文章

  1. Java中的注解到底是如何工作的?
  2. [转] Jenkins实战演练之Windows系统节点管理
  3. RS(纠删码)技术浅析及Python实现
  4. win10 自待wmi应用 查询wmi
  5. iPad2泄密 责任只在“内鬼”吗?
  6. javax.naming.NamingException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver'
  7. 爆款专栏《Python 黑科技》目录导航丨进度:12/50
  8. 15拆分成3个不同的自然数_一个简单的算法 - 将一个正整数拆分成指定几个正整数的组合...
  9. 工作后,成长速度是如何产生差异的?
  10. 随机效应与混合效应模型 SAS实践
  11. 双眼融合训练一个月_最好的双眼视功能训练方法
  12. win10系统与时间服务器同步超时,如何解决Win10系统时间无法同步的问题?
  13. 如何锁定win10笔记本键盘
  14. Python生成随机数字/字符
  15. 《皮囊》——蔡崇达,读后感
  16. python selenium中析构方法报错sys.meta_path is None, Python is likely shutting down如何解决?
  17. 什么是PE,PE有什么意义?
  18. win10无法登录Microsoft账号(登录页面无法加载)
  19. 传奇修改完怪物血量后服务器不变,传奇怪物的血量调整方法(图文)
  20. 用MATLAB将bilibili缓存视频批量转换成MP4的方法

热门文章

  1. VirtualBox中,LINUX与Windows可以通过链接来跳转
  2. 中国气候变暖绝对是事实
  3. python余弦定理求角_余弦定理计算文章相似度
  4. linux查找当前目录下所有子目录特定文件类型
  5. Qt C++调用Python,解决线程问题,以及GIL锁的处理
  6. 微型计算机中硬盘工作时 应注意避免,1硬盘工作时应特别注意避免(B)
  7. 点云自适应滤波matlab代码,散乱点云自适应滤波算法
  8. 非确定性算法_《长安十二时辰》背后的文娱大脑:如何提升爆款的确定性?
  9. android tv背景图片,android中shape绘制背景图片
  10. server2012卸载oracle,Windows Server 2008 R2卸载干净ORACLE 11G