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 相关文章推荐
javascript笔试题目附答案@20081025_jb51.net
Oct 26 Javascript
event对象获取方法总结在google浏览器下测试
Nov 03 Javascript
原生js事件的添加和删除的封装
Jul 01 Javascript
javascript框架设计读书笔记之种子模块
Dec 02 Javascript
js判断是否按下了Shift键的方法
Jan 27 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
Sep 24 Javascript
jq给页面添加覆盖层遮罩的实例
Feb 16 Javascript
Node.JS利用PhantomJs抓取网页入门教程
May 19 Javascript
Angular 2父子组件数据传递之@Input和@Output详解 (上)
Jul 05 Javascript
基于Vue中使用节流Lodash throttle详解
Oct 30 Javascript
Vue中函数防抖节流的理解及应用实现
Apr 24 Javascript
详解Vue中$props、$attrs和$listeners的使用方法
Feb 18 Vue.js
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
用session做客户验证时的注意事项
2006/10/09 PHP
php结合curl实现多线程抓取
2015/07/09 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
2018/09/04 PHP
PHP如何将图片文件上传到另外一台服务器上
2019/08/26 PHP
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
基于jQuery捕获超链接事件进行局部刷新代码
2012/05/10 Javascript
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
js和jquery设置disabled属性为true使按钮失效
2014/08/07 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
JavaScript插件化开发教程(六)
2015/02/01 Javascript
基于jQuery实现在线选座之高铁版
2015/08/24 Javascript
javascript如何写热点图
2015/12/08 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
JavaScript function函数种类详解
2016/02/22 Javascript
js匿名函数作为函数参数详解
2016/06/01 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
React Native基础入门之初步使用Flexbox布局
2018/07/02 Javascript
在Vue 中获取下拉框的文本及选项值操作
2020/08/13 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
python实现图片变亮或者变暗的方法
2015/06/01 Python
django之从html页面表单获取输入的数据实例
2020/03/16 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
2020/06/02 Python
python如何进入交互模式
2020/07/06 Python
CSS3实现全景图特效示例代码
2018/03/26 HTML / CSS
馥绿德雅美国官方网站:Rene Furterer头皮护理专家
2019/05/01 全球购物
医学类导师推荐信范文
2013/11/19 职场文书
银行介绍信范文
2014/01/10 职场文书
诉讼代理人授权委托书
2014/04/08 职场文书
关于国庆节的演讲稿
2014/09/05 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
计算机考试作弊检讨书1000字
2015/01/01 职场文书
学校拾金不昧表扬信
2015/01/16 职场文书
教你怎么用Python处理excel实现自动化办公
2021/04/30 Python
Python制作动态字符画的源码
2021/08/04 Python
vue代码分块和懒加载非必要资源文件
2022/04/11 Vue.js