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 相关文章推荐
jqGrid随窗口大小变化自适应大小的示例代码
Dec 28 Javascript
javascript设计模式之工厂模式示例讲解
Mar 04 Javascript
Javscript删除数组中指定元素并返回新数组
Mar 06 Javascript
JavaScript sub方法入门实例(把字符串显示为下标)
Oct 17 Javascript
jquery实现鼠标经过显示下划线的渐变下拉菜单效果代码
Aug 24 Javascript
JavaScript中this的四个绑定规则总结
Sep 26 Javascript
使用JavaScript实现表格编辑器(实例讲解)
Aug 02 Javascript
vue2实现数据请求显示loading图
Nov 28 Javascript
[原创]js实现保存文本框内容为本地文件兼容IE,chrome,火狐浏览器
Feb 14 Javascript
微信小程序实现联动选择器
Feb 15 Javascript
仿vue-cli搭建属于自己的脚手架的方法步骤
Apr 17 Javascript
js 数组当前行添加数据方法详解
Jul 28 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
实现dedecms全站URL静态化改造的代码
2007/03/29 PHP
php支付宝APP支付功能
2020/07/29 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
在Javascript中 声明时用&quot;var&quot;与不用&quot;var&quot;的区别
2013/04/15 Javascript
JQuery写动态树示例代码
2013/07/31 Javascript
jquery html动态生成select标签出问题的解决方法
2013/11/20 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
2015/11/17 Javascript
JavaScript-html标题滚动效果的简单实现
2016/09/08 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
JavaScript 2018 中即将迎来的新功能
2018/09/21 Javascript
在Vue中用canvas实现二维码和图片合成海报的方法
2019/06/10 Javascript
解决vue的过渡动画无法正常实现问题
2019/10/31 Javascript
[40:05]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第一局
2016/02/25 DOTA
python实现简单的socket server实例
2015/04/29 Python
python装饰器初探(推荐)
2016/07/21 Python
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
使用Python制作自动推送微信消息提醒的备忘录功能
2018/09/06 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
2019/06/27 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
2019/07/04 Python
Python图像处理PIL各模块详细介绍(推荐)
2019/07/17 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
2020/03/02 Python
Python爬虫爬取有道实现翻译功能
2020/11/27 Python
HTML5 语义化结构化规范化
2008/10/17 HTML / CSS
编写html5时调试发现脚本php等网页js、css等失效
2013/12/31 HTML / CSS
猫咪家具:CatsPlay
2018/11/03 全球购物
党校培训思想汇报
2013/12/30 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
Python中使用subprocess库创建附加进程
2021/05/11 Python
详解Redis复制原理
2021/06/04 Redis
用Python创建简易网站图文教程
2021/06/11 Python