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 相关文章推荐
jQuery select表单提交省市区城市三级联动核心代码
Jun 09 Javascript
jQuery实现瀑布流的取巧做法分享
Jan 12 Javascript
jQuery中scrollLeft()方法用法实例
Jan 16 Javascript
详解JavaScript的流程控制语句
Nov 30 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
May 24 Javascript
JavaScript代码里的判断小结
Aug 22 Javascript
JavaScript生成验证码并实现验证功能
Sep 24 Javascript
详解vue-cli 快速搭建单页应用之遇到的问题及解决办法
Mar 01 Javascript
vue 做移动端微信公众号采坑经验记录
Apr 26 Javascript
JavaScript中call和apply方法的区别实例分析
Aug 03 Javascript
Vue $mount实战之实现消息弹窗组件
Apr 22 Javascript
Vue实现点击箭头上下移动效果
Jun 11 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
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
laravel实现上传图片并在页面显示的例子
2019/10/14 PHP
利用js对象弹出一个层
2008/03/26 Javascript
jQuery之选项卡的简单实现
2014/02/28 Javascript
javascript中递归函数用法注意点
2015/07/30 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
微信小程序 加载 app-service.js 错误解决方法
2016/10/12 Javascript
JS实现新建文件夹功能
2017/06/17 Javascript
Angular在模板驱动表单中自定义校验器的方法
2017/08/09 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
vue router demo详解
2017/10/13 Javascript
vue中关闭eslint的方法分析
2018/08/04 Javascript
vue-router的使用方法及含参数的配置方法
2018/11/13 Javascript
Vue中JS动画与Velocity.js的结合使用
2019/02/13 Javascript
echarts实现词云自定义形状的示例代码
2019/02/20 Javascript
使用Vue.js 和Chart.js制作绚丽多彩的图表
2019/06/15 Javascript
JavaScript Array对象基本方法详解
2019/09/03 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
[01:09:19]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第二场 2月28日
2021/03/11 DOTA
Python解析nginx日志文件
2015/05/11 Python
解决Python传递中文参数的问题
2015/08/04 Python
python在不同层级目录import模块的方法
2016/01/31 Python
Python基于回溯法解决01背包问题实例
2017/12/06 Python
python删除过期log文件操作实例解析
2018/01/31 Python
python框架flask表单实现详解
2019/11/04 Python
使用TensorBoard进行超参数优化的实现
2020/07/06 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
2020/12/01 Python
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
全球领先的美容用品专卖店:Beauty Plus Salon
2018/09/04 全球购物
学校文明单位申报材料
2014/05/06 职场文书
校园绿化美化方案
2014/06/08 职场文书
2015大学生暑期实习报告
2015/07/13 职场文书
学生会2016感恩节活动小结
2016/04/01 职场文书
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers
javascript中Set、Map、WeakSet、WeakMap区别
2022/12/24 Javascript
MySQL索引失效十种场景与优化方案
2023/05/08 MySQL