javascript之querySelector和querySelectorAll使用介绍


Posted in Javascript onDecember 20, 2011

一开始很多人都会拿jquery的选择器来跟这两个api做对比(我也是),比较异同本来没事,但却使一些同学对这两个api在浏览器中的实现产生了误解,特别是再dom element上调用此api时。
下面是我的jsFiddle示例,我就以此展开说明:
js代码:

(function(global) { 
global.doc = document; 
global.body = doc.getElementsByTagName('body')[0]; 
global.$ = function(id) { 
return doc.getElementById(id); 
} 
global.Logger = function(id) { 
this.logElem = $(id); 
this.logArr = []; 
}; 
global.Logger.prototype = { 
constructor: global.logger, 
append: function(comment) { 
this.logArr.push('<p>' + comment + '</p>'); 
}, 
flush: function() { 
this.logElem.innerHTML = this.logArr.join(''); 
}, 
clear: function() { 
this.logElem.innerHTML = ''; 
this.logArr = []; 
} 
}; 
})(this); 
(function() { 
var logger = new Logger('log'); 
var items = $('inner').querySelectorAll('#main h4.inside'); 
logger.append(items.length); 
for(var i = 0, len = items.length; i < len; i++) { 
logger.append(items[i].innerHTML); 
} 
logger.flush(); 
})(); 
(function(global) { 
global.doc = document; 
global.body = doc.getElementsByTagName('body')[0]; 
global.$ = function(id) { 
return doc.getElementById(id); 
} 
global.Logger = function(id) { 
this.logElem = $(id); 
this.logArr = []; 
}; 
global.Logger.prototype = { 
constructor: global.logger, 
append: function(comment) { 
this.logArr.push('<p>' + comment + '</p>'); 
}, 
flush: function() { 
this.logElem.innerHTML = this.logArr.join(''); 
}, 
clear: function() { 
this.logElem.innerHTML = ''; 
this.logArr = []; 
} 
}; 
})(this); 
(function() { 
var logger = new Logger('log'); 
var items = $('inner').querySelectorAll('#main h4.inside'); 
logger.append(items.length); 
for(var i = 0, len = items.length; i < len; i++) { 
logger.append(items[i].innerHTML); 
} 
logger.flush(); 
})();

html代码:

<div id="main"> 
<div id="inner"> 
<h4 class="inside">h4 inside 1</h4> 
<h4 class="inside">h4 inside 2</h4> 
<ul class="nodelist"> 
<li>list item one</li> 
<li>list item two</li> 
<li>list itme three</li> 
</ul> 
</div> 
<div id="outter"> 
<h4 class="outside">h4 outside 1</h4> 
<h4 class="outside">h4 outside 2</h4> 
</div> 
<div id="log"></div>

css代码:

#log { 
font-size: 10px; 
}

误解就在于对$('inner').querySelectorAll('#main h4.inside')的实现理解,不少人一开始几乎都认为是直接从div[id='inner']的孩子中进行查找(我也是),这个#main有点碍眼。实际上它还是根据selector string从整个document上查找,再返回属于div[id='inner']的子节点。很多人会疑惑,那么为什么不按照直接按父节点找子节点的方式来实现呢?就像elem.getElementsByTagName,我的想法是灵活selector string吧。

querySelector只返回匹配的第一个元素,如果没有匹配项,返回null。
querySelectorAll返回匹配的元素集合,如果没有匹配项,返回空的nodelist(节点数组)。

并且返回的结果是静态的,之后对document结构的改变不会影响到之前取到的结果。
目前IE8+,ff,chrome都支持此api(IE8中的selector string只支持css2.1的)。

Javascript 相关文章推荐
html读出文本文件内容
Jan 22 Javascript
js change,propertychange,input事件小议
Dec 20 Javascript
Node.js中防止错误导致的进程阻塞的方法
Aug 11 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
Oct 07 Javascript
基于Bootstrap仿淘宝分页控件实现代码
Nov 07 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
Apr 01 Javascript
详解Angular 4.x Injector
May 04 Javascript
彻底搞懂JavaScript中的apply和call方法(必看)
Sep 18 Javascript
微信小程序 循环及嵌套循环的使用总结
Sep 26 Javascript
在js代码拼接dom对象到页面上的模板总结
Oct 21 Javascript
vue的列表交错过渡实现代码示例
May 05 Javascript
微信小程序实现吸顶特效
Jan 08 Javascript
js有关元素内容操作小结
Dec 20 #Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
Dec 20 #Javascript
suggestion开发小结以及对键盘事件的总结(针对中文输入法状态)
Dec 20 #Javascript
js change,propertychange,input事件小议
Dec 20 #Javascript
JavaScript面向对象设计二 构造函数模式
Dec 20 #Javascript
Javascript面向对象设计一 工厂模式
Dec 20 #Javascript
用JavaScript仿PS里的羽化效果代码
Dec 20 #Javascript
You might like
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
2012/05/07 PHP
php调用dll的实例操作动画与代码分享
2012/08/14 PHP
PHP 读取大文件的X行到Y行内容的实现代码
2013/06/24 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
2015/07/01 PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
2019/10/24 PHP
有一段有意思的代码-javascript现实多行信息
2007/08/26 Javascript
JavaScript 32位整型无符号操作示例
2013/12/08 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
JavaScript中最简洁的编码html字符串的方法
2014/10/11 Javascript
JavaScript中的数据类型转换方法小结
2015/10/26 Javascript
微信和qq时间格式模板实例详解
2016/10/21 Javascript
d3.js实现简单的网络拓扑图实例代码
2016/11/06 Javascript
vue2.0中click点击当前li实现动态切换class
2017/06/21 Javascript
浅谈Vuex注入Vue生命周期的过程
2019/05/20 Javascript
JS实现简单日历特效
2020/01/03 Javascript
Nodejs + Websocket 指定发送及群聊的实现
2020/01/09 NodeJs
小程序富文本提取图片可放大缩小
2020/05/26 Javascript
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
python 全文检索引擎详解
2017/04/25 Python
Python实现的简单计算器功能详解
2018/08/25 Python
CentOS 7下安装Python3.6 及遇到的问题小结
2018/11/08 Python
Python识别快递条形码及Tesseract-OCR使用详解
2019/07/15 Python
python如何使用Redis构建分布式锁
2020/01/16 Python
postman和python mock测试过程图解
2020/02/22 Python
python实现QQ邮箱发送邮件
2020/03/06 Python
Python telnet登陆功能实现代码
2020/04/16 Python
Python实现中英文全文搜索的示例
2020/12/04 Python
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
伦敦一家非常流行的时尚精品店:Oxygen Boutique
2017/01/15 全球购物
波兰办公用品和学校用品在线商店:Dlabiura24.pl
2020/11/18 全球购物
C++是不是类型安全的
2014/02/18 面试题
董事长秘书职责
2014/01/31 职场文书
管事部库房保管员岗位职责
2014/02/21 职场文书
安全教育培训制度
2015/08/06 职场文书
HTML中的表单Form实现居中效果
2021/05/25 HTML / CSS