zepto中的$(".111")出错,jQuery中$(".111")不出错的原因:

zepto用document.querySelector实现,jQuery用document.getElementById实现。

二者区别:http://www.zhihu.com/question/24702250

1. W3C 标准
querySelectorAll 属于 W3C 中的 Selectors API 规范 [1]。而 getElementsBy 系列则属于 W3C 的 DOM 规范 [2]。

2. 浏览器兼容
querySelectorAll 已被 IE 8+、FF 3.5+、Safari 3.1+、Chrome 和 Opera 10+ 良好支持 。
getElementsBy 系列,以最迟添加到规范中的 getElementsByClassName 为例,IE 9+、FF 3 +、Safari 3.1+、Chrome 和 Opera 9+ 都已经支持该方法了。

3. 接收参数
querySelectorAll 方法接收的参数是一个 CSS 选择符。而 getElementsBy 系列接收的参数只能是单一的className、tagName 和 name。代码如下 [3]:

  1. var c1 = document.querySelectorAll('.b1 .c');
  2. var c2 = document.getElementsByClassName('c');
  3. var c3 = document.getElementsByClassName('b2')[0].getElementsByClassName('c');

需要注意的是,querySelectorAll 所接收的参数是必须严格符合 CSS 选择符规范的。所以下面这种写法,将会抛出异常。代码如下 [4]:

  1. try {
  2. var e1 = document.getElementsByClassName('1a2b3c');
  3. var e2 = document.querySelectorAll('.1a2b3c');
  4. } catch (e) {
  5. console.error(e.message);
  6. }
  7. console.log(e1 && e1[0].className);
  8. console.log(e2 && e2[0].className);
    CSS 选择器中的元素名,类和 ID 均不能以数字为开头。)
  9.  
  10. 4. 返回值
    大部分人都知道,querySelectorAll 返回的是一个 Static Node List,而 getElementsBy 系列的返回的是一个 Live Node List
    看看下面这个经典的例子 [5]:
  1. // Demo 1
  2. var ul = document.querySelectorAll('ul')[0],
  3. lis = ul.querySelectorAll("li");
  4. for(var i = 0; i < lis.length ; i++){
  5. ul.appendChild(document.createElement("li"));
  6. }
  7. // Demo 2
  8. var ul = document.getElementsByTagName('ul')[0],
  9. lis = ul.getElementsByTagName("li");
  10. for(var i = 0; i < lis.length ; i++){
  11. ul.appendChild(document.createElement("li"));
  12. }
  1. 因为 Demo 2 中的 lis 是一个动态的 Node List 每一次调用 lis 都会重新对文档进行查询,导致无限循环的问题。
    Demo 1 中的 lis 是一个静态的 Node List,是一个 li 集合的快照,对文档的任何操作都不会对其产生影响。
  2.  
  3. 但为什么要这样设计呢?
    其实,在 W3C 规范中对 querySelectorAll 方法有明确规定 [6]:

The NodeList object returned by the querySelectorAll() method must be static ([DOM], section 8).

  1. 那什么是 NodeList 呢?
    W3C 中是这样说明的 [7]:

The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.

  1. 所以,NodeList 本质上是一个动态的 Node 集合,只是规范中对 querySelectorAll 有明确要求,规定其必须返回一个静态的 NodeList 对象。
  2.  
  3. 我们再看看在 Chrome 上面是个什么样的情况:
  1. document.querySelectorAll('a').toString(); // return "[object NodeList]"
  2. document.getElementsByTagName('a').toString(); // return "[object HTMLCollection]"
  1. 这里又多了一个 HTMLCollection 对象出来,那 HTMLCollection 又是什么?
  2.  
  3. HTMLCollection W3C 的定义如下 [8]:

An HTMLCollection is a list of nodes. An individual node may be accessed by either ordinal index or the node's name or id attributes.
Note: Collections in the HTML DOM are assumed to be live meaning that they are automatically updated when the underlying document is changed.

  1. 实际上,HTMLCollection NodeList 十分相似,都是一个动态的元素集合,每次访问都需要重新对文档进行查询。两者的本质上差别在于,HTMLCollection 是属于 Document Object Model HTML 规范,而 NodeList 属于 Document Object Model Core 规范。
    这样说有点难理解,看看下面的例子会比较好理解 [9]:
  1. var ul = document.getElementsByTagName('ul')[0],
  2. lis1 = ul.childNodes,
  3. lis2 = ul.children;
  4. console.log(lis1.toString(), lis1.length); // "[object NodeList]" 11
  5. console.log(lis2.toString(), lis2.length); // "[object HTMLCollection]" 4
  1. NodeList 对象会包含文档中的所有节点,如 ElementText Comment 等。
    HTMLCollection 对象只会包含文档中的 Element 节点。
    另外,HTMLCollection 对象比 NodeList 对象 多提供了一个 namedItem 方法。
  2.  
  3. 所以在现代浏览器中,querySelectorAll 的返回值是一个静态的 NodeList 对象,而 getElementsBy 系列的返回值实际上是一个 HTMLCollection 对象
    [1] Selectors API Level 2
    [2] Document Object Model Core
    [3] http://jsbin.com/cuduyigi/1/edit?html,js,console
    [4] http://jsbin.com/mabefihi/1/watch?html,js,console
    [5] 
    Demo 1: http://jsbin.com/daduziba/1/watch?html,js,output
    Demo 2: http://jsbin.com/xuvodipo/1/watch?html,js,output
    [6] Selectors API Level 2
    [7] Document Object Model Core
    [8] Document Object Model HTML
    [9] http://jsbin.com/qijivove/1/watch?html,js,console

document.getElementById和document.querySelector的区别的更多相关文章

  1. document.getElementById 和 document.getElementsByClassName获取DOM元素的区别

    想必小伙伴们对于 JS 获取DOM的几种方法早已烂熟于心,了然于胸,   尤其是 document.getElementById 和 document.getElementsByClassName, ...

  2. document.getElementById(“id”)与$("#id")的区别

    document.getElementById("id")可以直接获取当前对象, jQuery利用$("#id")获取的是一个[object Object],需 ...

  3. document.getElementById & document.querySelector

    document.getElementById & document.querySelector https://developer.mozilla.org/en-US/docs/Web/AP ...

  4. HTML5中类jQuery选择器querySelector的高级使用 document.querySelectorAll.bind(document);

    基本用法 querySelector 该方法返回满足条件的单个元素.按照深度优先和先序遍历的原则使用参数提供的CSS选择器在DOM进行查找,返回第一个满足条件的元素. ----> querySe ...

  5. 创建母版页导致js出现“ 'document.getElementById(...)' 为空或不是对象”错误

    导读:一个控件在设计时的ID往往不同于生成页面后的ID,为了获得控件客户端ID,我们可以从生成的页面入手,冷静思考,把握主次,从底层框架入手 本文将为大家介绍一下 ASP.NET中在创建母版页时引来的 ...

  6. document.write vs document.getElementById

    document.write: JavaScript中对document.open所开启的文档流(document stream操作的API方法,它能够直接在文档流中写入字符串,一旦文档流已经关闭,那 ...

  7. document.getElementById()与 $()区别

    document.getElementById()返回的是DOM对象,而$()返回的是jQuery对象 什么是jQuery对象? ---就是通过jQuery包装DOM对象后产生的对象.jQuery对象 ...

  8. jquery中的$("#id")与document.getElementById("id")的区别

    以前一直认为jquery中的$("#id")和document.getElementByIdx_x("id")得到的效果是一样的,今天做特效的时候才发现并不是这 ...

  9. JS函数动作分层结构详解及Document.getElementById 释义 js及cs数据类型区别 事件 函数 变量 script标签 var function

    html +css 静态页面 js     动态 交互   原理: js就是修改样式, 比如弹出一个对话框. 弹出的过程就是这个框由disable 变成display:enable. 又或者当鼠标指向 ...

随机推荐

  1. struts2运行机制

    struts2是web应用中一个常用的mvc框架,下面探讨一下其内部运行机制: 1.从客服端浏览器输入的url后,客服端通过http协议发送一个请求到服务器(tomcat),Tomcat收到这个请求之 ...

  2. Search in Rotated Sorted Array II

    Question: Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? W ...

  3. yii2.0 url 跳转

    //转发 $this->render('page1',['id'=>3,'mark'=>2]);    //显示page1页面 并传递 id mark 2个参数 //重定向 $thi ...

  4. 深入学习Struts2

    本部分主要介绍struts.xml的常用配置. 1.1.    包配置: Struts2框架中核心组件就是Action.拦截器等,Struts2框架使用包来管理Action和拦截器等.每个包就是多个A ...

  5. oracle 导入数据时提示只有 DBA 才能导入由其他 DBA 导出的文件

    提示: IMP-00013: 只有 DBA 才能导入由其他 DBA 导出的文件 IMP-00000: 未成功终止导入 解决方法: 用户system用户登录然后授权 grant dba to hszx

  6. poj 3254(状态压缩基础题)

    题意:就是你给一个n行m列的矩阵,矩阵里的元素由0和1组成,1代表肥沃的土地可以种植作物,0则不可以种植作物,并且相邻的土地不能同时种植作物,问你有多少种种植方案. 分析:这是我做的第一道状态压缩dp ...

  7. [再寄小读者之数学篇](2014-11-19 $\sin x/x$ 在 $(0,\pi/2)$ 上递增)

    $$\bex \frac{\sin x}{x}\nearrow. \eex$$ Ref. [Proof Without Words: Monotonicity of $\sin x/x$ on $(0 ...

  8. CMDB属性及分类问题思考

    定义的烦恼 在某一次系统监控的讨论会议上,我随便提出了个问题:“如何定义一个系统?”,结果答案就五花八门起来了,会议也跑题了. 为什么问这个问题,是因为某些同事觉得某个系统比较大,就往下分为子系统.组 ...

  9. spring开发相关网址

    jar包下载地址:http://repo.springsource.org/libs-release-local/org/springframework/spring/

  10. Chapter12:动态内存

    智能指针——shared_ptr 为了更容易地使用动态内存,新的标准提供了智能指针来管理动态对象.智能指针的行为类似常规指针,重要的区别是它负责自动释放指向的对象. 智能指针的使用方式与普通指针类似. ...