javascript的dom选择器
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选择器相关推荐
- Javascript操作DOM常用API总结
文本整理了javascript操作DOM的一些常用的api,根据其作用整理成为创建,修改,查询等多种类型的api,主要用于复习基础知识,加深对原生js的认识. 基本概念 在讲解操作DOM的api之前, ...
- JavaScript及jQuery选择器(二)
1.选择指定ID元素 对于选择DOM元素,javascript提供了以下两个方法: document.getElementById(): document.getElementsByTagName() ...
- 【repost】Javascript操作DOM常用API总结
Javascript操作DOM常用API总结 文本整理了javascript操作DOM的一些常用的api,根据其作用整理成为创建,修改,查询等多种类型的api,主要用于复习基础知识,加深对原生js的认 ...
- JavaScript中DOM操作
Web前端基础修炼 HTML基本标签详解与运行截图 CSS基本操作详解及截图演示 JavaScript基础(ECMAScript) JavaScript中DOM操作 JavaScript中BOM操作 ...
- JavaScript 之 DOM中的三大对象
下面是对JavaScript DOM中三大对象的整理,希望可以帮助到有需要的小伙伴. JavaScript 之 DOM中的三大对象 一.Document对象 1.Document对象是什么 Docum ...
- JavaScript中DOM对象的详解
*** JavaScript中DOM对象的详解*** DOM对象:Document Object Model,文档对象模型.也称为document(文档对象),是HTML页面当前窗体的内容,是连接JS ...
- JavaScript的DOM知识点总结
目录 1.DOM重点核心 2.DOM事件流 3.DOM知识点总结 4.常见案例 视频资料,pink老师讲的超级详细,JavaScript的DOM操作:黑马程序员JavaScript核心教程,前端基础教 ...
- JavaScript之DOM学习笔记
目录 1.DOM简介 1.1.什么是DOM 2.获取元素 2.1.如何获取页面元素 2.2.根据ID获取 2.3.根据标签名获取 2.4.通过H5新增方法获取 3.事件基础 3.1.事件概述 3.2. ...
- JavaScript 的DOM对象
JavaScript 的DOM对象 1.DOM对象的概念 1.DOM:文档对象模型(Document Object Model) 2.document对象,是DOM中的顶级对象,封装了HTML的相关属 ...
- keras 香草编码器_用香草javascript遍历dom
keras 香草编码器 If you're new to JavaScript, you're likely starting out with Vanilla JavaScript in order ...
最新文章
- Java中的注解到底是如何工作的?
- [转]	Jenkins实战演练之Windows系统节点管理
- RS(纠删码)技术浅析及Python实现
- win10 自待wmi应用 查询wmi
- iPad2泄密 责任只在“内鬼”吗?
- javax.naming.NamingException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver'
- 爆款专栏《Python 黑科技》目录导航丨进度:12/50
- 15拆分成3个不同的自然数_一个简单的算法 - 将一个正整数拆分成指定几个正整数的组合...
- 工作后,成长速度是如何产生差异的?
- 随机效应与混合效应模型 SAS实践
- 双眼融合训练一个月_最好的双眼视功能训练方法
- win10系统与时间服务器同步超时,如何解决Win10系统时间无法同步的问题?
- 如何锁定win10笔记本键盘
- Python生成随机数字/字符
- 《皮囊》——蔡崇达,读后感
- python selenium中析构方法报错sys.meta_path is None, Python is likely shutting down如何解决?
- 什么是PE,PE有什么意义?
- win10无法登录Microsoft账号(登录页面无法加载)
- 传奇修改完怪物血量后服务器不变,传奇怪物的血量调整方法(图文)
- 用MATLAB将bilibili缓存视频批量转换成MP4的方法
热门文章
- VirtualBox中,LINUX与Windows可以通过链接来跳转
- 中国气候变暖绝对是事实
- python余弦定理求角_余弦定理计算文章相似度
- linux查找当前目录下所有子目录特定文件类型
- Qt C++调用Python,解决线程问题,以及GIL锁的处理
- 微型计算机中硬盘工作时 应注意避免,1硬盘工作时应特别注意避免(B)
- 点云自适应滤波matlab代码,散乱点云自适应滤波算法
- 非确定性算法_《长安十二时辰》背后的文娱大脑:如何提升爆款的确定性?
- android tv背景图片,android中shape绘制背景图片
- server2012卸载oracle,Windows Server 2008 R2卸载干净ORACLE 11G