原文链接:http://blog.garstasio.com/you-dont-need-jquery/selectors/

我的Blog:http://cabbit.me/you-dont-need-jquery/selector/

上一篇文章抛弃jQuery:Why?引起了很多朋友的讨论,在这里我想强调,这一系列文章从来不希望开发人员不分情况的丢弃jQuery,也绝对不会抵制使用JavaScript库,手工处理兼容性问题,这篇及后面的专题都提供了一些能够替代jQuery的库。

如果我说“抛弃jQuery吧”,就有人觉得等于“抛弃所有的库,用C和汇编来写代码”,那我想我们更应该思考一下,我们是不是真的把jQuery当成了JavaScript的全部

jQuery的选择符模块无比优雅,以至于我见过很多Web框架和应用中引用了庞大的jQuery,只是因为它提供了方便的DOM元素选择函数。我已经数不清自己写过多少次 $(#myElement) 或者 $('.myElement') 了,以至于在没有jQuery时经常束手无策。事实上使用DOM API选择元素并没有那么难,它或许没有jQuery的那么简短,不过用起来也足够简单了。

ID

jQuery

// 返回一个jQuery对象
$('#myElement');

DOM API,我们最常见到的是这样:

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

IE 8及以上版本的浏览器中可以使用querySelector函数:

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

这两种DOM API函数都直接返回一个元素,有测试表明getElementById函数比querySelector函数效率更高一些

随着浏览器升级,对querySelector函数的支持越来越好,jQuery的选择函数还有什么决定性的优势么?

CSS Classes

jQuery

// 返回所有匹配元素的jQuery对象
$('.myElement');

DOM API,IE 9及以上版本的浏览器中有专用的getElementsByClassName函数:

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

IE 8及以上版本的浏览器中可以使用querySelectorAll函数:

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

两种DOM API中getElementsByClassName的效率最高,返回一个HTMLCollection集合。后一种(querySelectorAll)返回NodeList类型。

jQuery能做到的,DOM API同样也做到了,不是么?

HTML 标签名

假设我们要选择所有的 div 元素:

jQuery

$('div');

DOM API,最常见的函数是这个:

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

IE 8及以上版本的浏览器中依然可以使用querySelectorAll函数:

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

两种DOM API相比,getElementsByTagName的效率会稍微高一些。

HTML 属性

假设我们要选择 data-foo-bar 属性为 someval 的元素:

jQuery

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

DOM API,IE 8及以上版本的浏览器中可以继续使用万能的querySelectorAll函数:

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

伪类

假设我们要从 id=myForm 的 from 元素中选择具备 :invalid 伪类的元素:

jQuery

$('#myForm :invalid');

DOM API,IE 8及以上版本的浏览器中可以继续使用万能的querySelectorAll函数:

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

子元素

假设父元素 id="myParent" ,如果我们只是想简单的选择所有子元素:

jQuery

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

DOM API,最熟悉的是这个:

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

IE 9及以上版本的浏览器中可以直接使用children来获取:

// IE 9+
// NOTE: This ignores comment & text nodes.
document.getElementById('myParent').children;

如果只是想获取包含 ng-click 属性的直接子元素呢?

jQuery

$('#myParent').children('[ng-click]');
// 或者
$('#myParent > [ng-click]');

DOM API,我是从这时开始发现querySelector比我想象的要强大…

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

后代元素

假设祖先节点 id="myParent",我们希望获取其后代的所有超链接:

jQuery

$('#myParent A');

DOM API,IE 8及以上版本的浏览器里可以这样:

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

排除元素

假设我们要从 div 元素中获取出不带“ignore” class的元素

jQuery

$('DIV').not('.ignore');
// 或者
$('DIV:not(.ignore)');

DOM API,IE 8及以上版本的浏览器中可以这样:

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

多重选择

假设我们要选择所有的 div , a 和 script 元素:

jQuery

$('DIV, A, SCRIPT');

DOM API,IE 8及以上版本的浏览器里可以这样:

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

仿造 jQuery 的 “$”

发现什么规律了么?

如果我们只考虑IE8及以上的浏览器,我们可以通过简单的代码“仿造”出类似jQuery中“$”选择符的效果:

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

这段代码之后,你就可以在脚本中使用$来进行大部分选择元素的操作了。

可以替代 jQuery 的专用选择符模块

对于大部分JavaScript项目来说,原生的浏览器API已经足够进行DOM元素的选择了,但是我们也注意到,这些函数在低版本的IE浏览器中不能很好的工作。为了兼容低版本的浏览器,我们需要引入一些第三方的模块来帮助我们完成选择元素的任务。

当然直接引入jQuery是最直接的方法,但是我们如果我们只是为了享受选择元素的便利,那jQuery显然大材小用(浪费带宽)了。我们不妨试试Sizzle,这是一个很小的模块,专注于选择DOM元素,事实上jQuery正是使用了Sizzle作为它的一部分Selectivizr是另一个选择,同样很小,专注于在较早版本的浏览器中支持CSS3选择符,他同样被包含在jQuery, prototype, mootools等框架中。

如果我漏掉了什么重要的选择符,请在评论里告诉我。

题图来自:https://www.safaribooksonline.com/library/view/head-first-jquery/9781449311988/ch04.html

抛弃jQuery:DOM API之选择元素的更多相关文章

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

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

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

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

  3. JQuery基础教程:选择元素(中)

    自定义选择符 JQuery在各种CSS选择符的基础上还添加了独有的完全不同的自定义选择符,注意,只要可能,jQuery就会使用浏览器原生的DOM选择符引擎去查找元素.但在使用自定义选择符的时候,就无法 ...

  4. 初识jQuery,八字真言“选择元素,对其操作”

    jQuery在我印象中,就是很多类似$(),然后昨天开始接触了,觉得很和谐,获取元素比JavaScript简单很多,有意思. 一.开始学习jQuery,下载jQuery库的文件 http://jque ...

  5. JQuery基础教程:选择元素(下)

    DOM遍历方法   利用前面介绍的jQuery选择符取得一组元素,就像是我们在DOM树中纵横遍历再经过筛选得到的结果一样.如果只有这一种取得元素的方式,那我们选择的余地从某个角度讲也是很有限的.很多情 ...

  6. 【JS】Intermediate7:jQuery:DOM API

    1.jQuery also makes performing actions on many elements at the same time simple 2.eg:$('.note').css( ...

  7. Jquery 根据HTML内容选择元素

    选择所有包含 "is" 的 元素: $("p:contains(is)")

  8. 抛弃jQuery:Why?

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

  9. jQuery DOM

    请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1  jQuer ...

随机推荐

  1. ASP.NET Core中如影随形的”依赖注入”[上]: 从两个不同的ServiceProvider说起

    我们一致在说 ASP.NET Core广泛地使用到了依赖注入,通过前面两个系列的介绍,相信读者朋友已经体会到了这一点.由于前面两章已经涵盖了依赖注入在管道构建过程中以及管道在处理请求过程的应用,但是内 ...

  2. OpenGL超级宝典笔记----渲染管线

    在OpenGL中任何事物都在3D空间中,但是屏幕和窗口是一个2D像素阵列,所以OpenGL的大部分工作都是关于如何把3D坐标转变为适应你屏幕的2D像素.3D坐标转为2D坐标的处理过程是由OpenGL的 ...

  3. 深入理解javascript的getTime方法

    1.理解getTime getTime() 方法返回一个时间的格林威治时间数值. 可以使用这个方法把一个日期时间赋值给另一个Date 对象. 语法: dateObj.getTime() 参数: 无. ...

  4. golang语言构造函数

    1.构造函数定义 构造函数 ,是一种特殊的方法.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数 ,可根据其参数个 ...

  5. HTML5实现文件断点续传

    HTML5的FILE api,有一个slice方法,可以将BLOB对象进行分割.前端通过FileList对象获取到相应的文件,按照指定的分割方式将大文件分段,然后一段一段地传给后端,后端再按顺序一段段 ...

  6. Postman - 功能强大的 API 接口请求调试和管理工具

    Postman 是一款功能强大的的 Chrome 应用,可以便捷的调试接口.前端开发人员在开发或者调试 Web 程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的 Fi ...

  7. 【从零开始学BPM,Day5】报表配置及自定义功能页面开发

    [课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第五天课程] 1.课程概要 Step 1 软件下载:H3 BP ...

  8. BPM配置故事之案例1-配置简单流程

    某天,Boss找到了信息部工程师小明. Boss:咱们新上了H3 BPM,你研究研究把现在的采购申请流程加上去吧,这是采购申请单. 小明:好嘞 采购申请单 小明回去后拿着表单想了想,开始着手配置. 他 ...

  9. 【QQ红包】手机发抢不到的口令红包

    这方法95%的人都抢不了 在QQ输入框输入一个表情,例如:阴险那个表情 将表情剪切到口令红包的口令里 这时候口令里的那个表情表情变成了符号 将符号删去一格,然后全选.复制 然后返回到QQ输入框粘贴 然 ...

  10. Help Hanzo (素数筛+区间枚举)

    Help Hanzo 题意:求a~b间素数个数(1 ≤ a ≤ b < 231, b - a ≤ 100000).     (全题在文末) 题解: a~b枚举必定TLE,普通打表MLE,真是头疼 ...