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 相关文章推荐
js获取对象为null的解决方法
Nov 21 Javascript
asp.net中oracle 存储过程(图文)
Aug 12 Javascript
JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性
Dec 26 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
Mar 28 Javascript
Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
Jun 07 Javascript
Bootstrap基本插件学习笔记之折叠(22)
Dec 08 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
Jun 15 Javascript
js获取地址栏参数的两种方法
Jun 27 Javascript
Bootstrap提示框效果的实例代码
Jul 12 Javascript
详谈for循环里面的break和continue语句
Jul 20 Javascript
浅谈Vuejs中nextTick()异步更新队列源码解析
Dec 31 Javascript
详解vue的双向绑定原理及实现
May 05 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
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
2007/09/24 PHP
php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
2012/11/01 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
JS 的应用开发初探(mootools)
2009/12/19 Javascript
利用jQuery的$.event.fix函数统一浏览器event事件处理
2009/12/21 Javascript
juqery 学习之五 文档处理 包裹、替换、删除、复制
2011/02/11 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
javascript检查浏览器是否支持flash的实现代码
2014/08/14 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
2014/11/16 Javascript
NodeJS学习笔记之MongoDB模块
2015/01/13 NodeJs
javascript模拟php函数in_array
2015/04/27 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
javascript特殊日历控件分享
2016/03/07 Javascript
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
2016/12/30 NodeJs
jQuery.Form实现Ajax上传文件同时设置headers的方法
2017/06/26 jQuery
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
2019/11/04 Javascript
Python中的map()函数和reduce()函数的用法
2015/04/27 Python
Python实现选择排序
2017/06/04 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
2019/05/09 Python
python设计微型小说网站(基于Django+Bootstrap框架)
2019/07/08 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
Python从MySQL数据库中面抽取试题,生成试卷
2021/01/14 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
linux系统都有哪些运行级别
2012/04/15 面试题
优秀民警事迹材料
2014/01/29 职场文书
兰兰过桥教学反思
2014/02/08 职场文书
中职招生先进个人材料
2014/08/31 职场文书
村党的群众路线教育实践活动工作总结
2014/10/25 职场文书
2015年保送生自荐信
2015/03/24 职场文书
校运会班级霸气口号
2015/12/24 职场文书
MySQL查询日期时间
2022/05/15 MySQL