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 相关文章推荐
不同浏览器的怪癖小结
Jul 11 Javascript
js Map List 遍历使用示例
Jul 10 Javascript
jQuery prev ~ siblings选择器使用介绍
Aug 09 Javascript
jquery遍历checkbox的注意事项说明
Feb 21 Javascript
JavaScript 经典实例日常收集整理(常用经典)
Mar 30 Javascript
javascript数组遍历的方法实例分析
Sep 13 Javascript
JavaScript 闭包机制详解及实例代码
Oct 10 Javascript
JS实现的驼峰式和连字符式转换功能分析
Dec 21 Javascript
BootStrap selectpicker后台动态绑定数据的方法
Jul 28 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
Sep 04 Javascript
微信小程序中使用echarts的实现方法
Apr 24 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
Oct 13 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页面局部刷新功能的实现小结
2013/06/21 PHP
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
Jquery方式获取iframe页面中的 Dom元素
2014/05/07 Javascript
鼠标悬浮停留三秒后自动显示大图js代码
2014/09/09 Javascript
javascript实现倒计时N秒后网页自动跳转代码
2014/12/11 Javascript
js实现选中复选框文字变色的方法
2015/08/14 Javascript
Java Mybatis框架入门基础教程
2015/09/21 Javascript
判断是否存在子节点的实现代码
2016/05/18 Javascript
AngularJs expression详解及简单示例
2016/09/01 Javascript
HTML5 实现的一个俄罗斯方块实例代码
2016/09/19 Javascript
BootStrap3使用错误记录及解决办法
2016/12/22 Javascript
Vue.js 2.0中select级联下拉框实例
2017/03/06 Javascript
jquery easyui如何实现格式化列
2017/07/30 jQuery
JavaScript伪数组用法实例分析
2017/12/22 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
2018/06/29 Javascript
vue实现在一个方法执行完后执行另一个方法的示例
2018/08/25 Javascript
Nodejs中获取当前函数被调用的行数及文件名详解
2018/12/12 NodeJs
uni-app实现点赞评论功能
2019/11/25 Javascript
python实现二叉查找树实例代码
2018/02/08 Python
在python中利用GDAL对tif文件进行读写的方法
2018/11/29 Python
Django 在iframe里跳转顶层url的例子
2019/08/21 Python
python sqlite的Row对象操作示例
2019/09/11 Python
哪种Python框架适合你?简单介绍几种主流Python框架
2020/08/04 Python
用python对excel进行操作(读,写,修改)
2020/12/25 Python
CSS3打造百度贴吧的3D翻牌效果示例
2017/01/04 HTML / CSS
10分钟理解CSS3 FlexBox弹性布局
2018/12/20 HTML / CSS
KARATOV珠宝在线商店:俄罗斯珠宝品牌
2019/03/13 全球购物
CK巴西官方网站:Calvin Klein巴西
2019/07/19 全球购物
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
入学申请自荐信范文
2014/02/26 职场文书
广告艺术设计专业自荐书
2014/07/08 职场文书
乡镇党建工作汇报材料
2014/08/14 职场文书
2015年留守儿童工作总结
2015/05/22 职场文书
详解盒子端CSS动画性能提升
2021/05/24 HTML / CSS
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS
基于Python实现射击小游戏的制作
2022/04/06 Python