英文原文:http://blog.garstasio.com/you-dont-need-jquery/selectors/愚人码头注:

  • 原作者的写这文章的意图是让我们抛弃jQuery,You Don’t Need jQuery!提倡我们使用原生的JavaScript,所以收集整理了jQuery语法对应的DOM API ;
  • 原作者参数的原因可以看这里:http://blog.garstasio.com/you-dont-need-jquery/why-not/ ,个人同意他的观点,简单的页面或应用,完全可以抛弃jQuery;但是出于开发效率和开发成本的考虑,我还是比较喜欢用jQuery。
  • 本人翻译或者说拷贝这篇文章的原因是:有一部分前端只会用jQuery,什么都网上找插件,甚至滥用jQuery,一点原生的JavaScript都不会写。QQ上,微博私信经常收到类似的基础问题。前端就是折腾的活,要从基础系统的学习。所以翻译了这篇文章,希望对新手和不写原生脚本的同学有一点点的帮助。

选择元素

有多少次你看到一个Web应用程序或库使用jQuery执行简单琐碎的元素选择?有多少次这样写:$(#myElement')? 或者这样$('.myElement')?嘘……你不需要用jQuery选择元素!这使用DOM API也很容易做到。

  1. IDs
  2. CSS Classes
  3. Tag Names
  4. Attributes
  5. Pseudo-classes
  6. Children
  7. Descendants
  8. Exclusion Selectors
  9. Multiple Selectors
  10. See a Pattern?
  11. Filling in the Gaps
  12. Next in this Series

By ID

jQuery

  1. // returns a jQuery obj w/ 0-1 elements
  2. $('#myElement');

DOM API

  1. // IE 5.5+
  2. document.getElementById('myElement');

…或者…

  1. // IE 8+
  2. document.querySelector('#myElement');

这两种方法返回一个Element(元素)。 需要注意的是使用 getElementById比使用querySelector更高效

请问jQuery的语法提供任何好处吗?我没有看到一个。你呢?

By CSS Class

jQuery

  1. // returns a jQuery obj w/ all matching elements
  2. $('.myElement');

DOM API

  1. // IE 9+
  2. document.getElementsByClassName('myElement');

…或者…

  1. // IE 8+
  2. document.querySelectorAll('.myElement');

第一个方法返回的HTMLCollection,并且效率最高的是第二个方法。 querySelectorAll总是返回一个NodeList(节点列表)

同样,这里真的很简单的东西。为什么要使用jQuery?

By Tag Name

举个例子,选择页面上所有的<div>元素:

jQuery

  1. $('div');

DOM API

  1. // IE 5.5+
  2. document.getElementsByTagName('div');

…或者…

  1. // IE 8+
  2. document.querySelectorAll('div');

正如预期的那样,querySelectorAll(返回 NodeList)比getElementsByTagName(返回HTMLCollection)效率低。

By Attribute(属性)

选择所有”data-foo-bar”值为”someval”的元素:

jQuery

  1. $('[data-foo-bar="someval"]');

DOM API

  1. // IE 8+
  2. document.querySelectorAll('[data-foo-bar="someval"]');

DOM API和jQuery语法非常相似。

By Pseudo-class(伪类)

选择所有在指定表单中的当前无效(:invalid 伪类)字段。假设我们的表单 ID为”myForm”。

jQuery

  1. $('#myForm :invalid');

DOM API

  1. // IE 8+
  2. document.querySelectorAll('#myForm :invalid');

Children(子元素)

选择一个特定元素的所有子元素。 假设我们的特定元素 ID为 “myParent”。

jQuery

  1. $('#myParent').children();

DOM API

  1. // IE 5.5+
  2. // NOTE: This will include comment and text nodes as well.
  3. document.getElementById('myParent').childNodes;

…或者…

  1. // IE 9+ (ignores comment & text nodes).
  2. document.getElementById('myParent').children;

但是,如果我们只想找到特定的子元素呢?比如,有 “ng-click”属性的子元素?

jQuery

  1. $('#myParent').children('[ng-click]');

…或…

  1. $('#myParent > [ng-click]');

DOM API

  1. // IE 8+
  2. document.querySelector('#myParent > [ng-click]');

Descendants(后代元素)

找到#myParent下面所有”a”元素。

jQuery

  1. $('#myParent A');

DOM API

  1. // IE 8+
  2. document.querySelectorAll('#myParent A');

Excluding Elements(排除元素)

选择所有<div>元素,排除那些有”ignore”样式类 <div>元素。

jQuery

  1. $('DIV').not('.ignore');

…或者…

  1. $('DIV:not(.ignore)');

DOM API

  1. // IE 9+
  2. document.querySelectorAll('DIV:not(.ignore)');

Multiple Selectors(多重选择)

选择所有<div>,<a><script>元素。

jQuery

  1. $('DIV, A, SCRIPT');

DOM API

  1. // IE 8+
  2. document.querySelectorAll('DIV, A, SCRIPT');

See a Pattern?

如果我们专注于选择器的支持,并且不需要处理IE8以下的浏览器,我们只需用这个替代jQuery:

  1. window.$ = function(selector) {
  2. var selectorType = 'querySelectorAll';
  3. if (selector.indexOf('#') === 0) {
  4. selectorType = 'getElementById';
  5. selector = selector.substr(1, selector.length);
  6. }
  7. return document[selectorType](selector);
  8. };

But I Want More!

对于绝大多数项目中,选择器支持到Web API就足够了。但是,如果你不幸需要支持IE7?在这种情况下,你可能需要一些第三方的代码来提供一些帮助。

当然,你仅仅需要引入jQuery,但当你只需要支持现在先进的选择器时,为什么用这么大的代码库呢?相反,尝试一下micro-library(微小的库)完全专注于元素选择。考虑,Sizzle,这恰好是jQuery使用的选择库。Selectivizr是另一种非常小的选择库,在很老的浏览器上也能支持CSS3选择器。

jQuery选择器对应的DOM API ——选择元素的更多相关文章

  1. jQuery 第二章 实例方法 DOM操作选择元素相关方法

    进一步选择元素相关方法:  .get() .eq() .find() .filter() .not() .is() .has() .add()集中操作  .end()回退操作 .get() $(&qu ...

  2. 深入学习jQuery选择器系列第二篇——过滤选择器之子元素选择器

    × 目录 [1]通用形式 [2]反向形式 [3]首尾元素 [4]唯一元素 前面的话 在上一篇中已经介绍过基础选择器和层级选择器,本文开始介绍过滤选择器.过滤选择器是jQuery选择器中最为庞大也是最为 ...

  3. Appium之UIAutomator API选择元素

    UI Automator测试框架提供了一组API来构建UI测试. 利用UI Automator API可以执行在测试设备中,打开‘设置’菜单或应用启动器等操作. UI Automator测试框架非常适 ...

  4. Jquery选择器,操作DOM

    刚接触jQuery,她真的是个好东西,操作DOM,修改样式,都很方便,主要获取DOM树的类和子代很方便. 今天用jq做了tab面包屑,不过用的是别人的代码,自己修改的,不错也做出来了,原理也有些明白, ...

  5. 抛弃jQuery:DOM API之选择元素

    原文链接:http://blog.garstasio.com/you-dont-need-jquery/selectors/ 我的Blog:http://cabbit.me/you-dont-need ...

  6. 抛弃jQuery:DOM API之操作元素

    原文链接:http://blog.garstasio.com/you-dont-need-jquery/dom-manipulation/ 我的Blog:http://cabbit.me/you-do ...

  7. JQuery基础教程:选择元素(上)

    jQuery最强大的特性之一就是它能够简化在DOM中选择元素的任务,DOM中的对象网络与家谱有几分类似,当我们提到网络中元素之间的关系时,会使用类似描述家庭关系的术语,比如父元素.子元素,等等.通过一 ...

  8. Jquery 系列(2) 选择元素

    Jquery基础学习 jQuery利用css选择符的能力,能够在DOM中快捷而轻松地获取元素. 主要内容如下: 介绍DOM树 如何通过CSS选择符在页中查找元素 扩展jQuery标准的CSS选择符 选 ...

  9. jQuery——选择元素

    ###理解DOM jQuery最强大的特性之一就是能够简化在DOM中选择元素的任务.**DOM(文档对象模型)**充当了JavaScript与网页之间的接口,它以对象网络而非纯文本的形式来表现HTML ...

随机推荐

  1. (@WhiteTaken)设计模式学习——单例模式

    单例模式,个人理解就是,使用了这个模式,可以保证一个类只生成唯一的实例对象.就是在整个程序中,这个类只存在一个实例对象. GoF对单例模式的定义:保证一个类,只有一个实例存在,同时提供能对该实例加以访 ...

  2. 【LeetCode题解】链表Linked List

    1. 链表 数组是一种顺序表,index与value之间是一种顺序映射,以\(O(1)\)的复杂度访问数据元素.但是,若要在表的中间部分插入(或删除)某一个元素时,需要将后续的数据元素进行移动,复杂度 ...

  3. 【小梅哥FPGA进阶教程】第九章 基于串口猎人软件的串口示波器

    九.基于串口猎人软件的串口示波器 1.实验介绍 本实验,为芯航线开发板的综合实验,该实验利用芯航线开发板上的ADC.独立按键.UART等外设,搭建了一个具备丰富功能的数据采集卡,芯航线开发板负责进行数 ...

  4. python解释器的安装;python2与python3同时在环境变量中时的解决方案

    新文档 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,addres ...

  5. 搭建Eclipse开发和调试环境(真机)

    由于工作原因,最近开始了Android开发.之前接触过一段时间Android,还是在2.x时代. 那个时候搭建开发环境还是挺麻烦的.又是Eclipse,又是ADT的,不同的版本还要安装对应开发包.现在 ...

  6. javascript之自增自减典型运算(易错)

    JavaScript“自增”运算符与表达式 递增运算符(++)是一个一元运算符,该运算符可以将操作数进行递增操作,即每次增加1.递增运算符要求其操作数必须是变量.对象中的某个属性或数组中的某个元素,并 ...

  7. LAMP学习小记

    记录今天学习到的解决LAMP环境搭建的两个小问题: 问题1.xshell无法连接到虚拟机上的linux主机 解决方法: (1)进入网络配置文件: vi /etc/sysconfig/network-s ...

  8. Java包装类缓存

    1.基本概念 在jdk1.5及之后的版本中,Java在5大包装类中(Byte,Charactor,Short,Integer,Long)增加了相应的私有静态成员内部类为相应包装类对象提供缓存机制,In ...

  9. Tomcat8 + Redis实现session集中管理

      环境准备:   部署两台 tomcat 8.0   安装 redis 服务器   下载工具库( commons-pool2-2.3.jar.jedis-2.7.2.jar .改良版的 tomcat ...

  10. jprofiler安装图解 ( 7_1 )

    环境: 1.sun jdk1.6.0 2.jprofiler_windows_6_0_2.exe 安装 1. jdk, 安装略... 2. jprofiler安装 一路next 到Enter lice ...