抛弃jQuery:DOM API之选择元素
原文链接: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之选择元素的更多相关文章
- 抛弃jQuery:DOM API之操作元素
原文链接:http://blog.garstasio.com/you-dont-need-jquery/dom-manipulation/ 我的Blog:http://cabbit.me/you-do ...
- JQuery基础教程:选择元素(上)
jQuery最强大的特性之一就是它能够简化在DOM中选择元素的任务,DOM中的对象网络与家谱有几分类似,当我们提到网络中元素之间的关系时,会使用类似描述家庭关系的术语,比如父元素.子元素,等等.通过一 ...
- JQuery基础教程:选择元素(中)
自定义选择符 JQuery在各种CSS选择符的基础上还添加了独有的完全不同的自定义选择符,注意,只要可能,jQuery就会使用浏览器原生的DOM选择符引擎去查找元素.但在使用自定义选择符的时候,就无法 ...
- 初识jQuery,八字真言“选择元素,对其操作”
jQuery在我印象中,就是很多类似$(),然后昨天开始接触了,觉得很和谐,获取元素比JavaScript简单很多,有意思. 一.开始学习jQuery,下载jQuery库的文件 http://jque ...
- JQuery基础教程:选择元素(下)
DOM遍历方法 利用前面介绍的jQuery选择符取得一组元素,就像是我们在DOM树中纵横遍历再经过筛选得到的结果一样.如果只有这一种取得元素的方式,那我们选择的余地从某个角度讲也是很有限的.很多情 ...
- 【JS】Intermediate7:jQuery:DOM API
1.jQuery also makes performing actions on many elements at the same time simple 2.eg:$('.note').css( ...
- Jquery 根据HTML内容选择元素
选择所有包含 "is" 的 元素: $("p:contains(is)")
- 抛弃jQuery:Why?
原文链接:http://blog.garstasio.com/you-dont-need-jquery/ 我的Blog:http://cabbit.me/you-dont-need-jquery/wh ...
- jQuery DOM
请尊重知识,请尊重原创 更多资料参考请见 http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1 jQuer ...
随机推荐
- 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成
阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...
- ES5对Array增强的9个API
为了更方便的对Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.indexOf ...
- Entity Framework Core 1.1 升级通告
原文地址:https://blogs.msdn.microsoft.com/dotnet/2016/11/16/announcing-entity-framework-core-1-1/ 翻译:杨晓东 ...
- iOS二维码生成、识别、扫描等
二维码扫描 前言: 最近的项目中使用到了二维码,二维码这个模块功能也完成:觉得还是有必要总结一下用来做记录.好长时间没有写二维码了都忘记在差不多了,重新拾起来还是挻快的. 二维码使用场景: 生活中有很 ...
- Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示
Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...
- AFNetworking 3.0 源码解读(八)之 AFImageDownloader
AFImageDownloader 这个类对写DownloadManager有很大的借鉴意义.在平时的开发中,当我们使用UIImageView加载一个网络上的图片时,其原理就是把图片下载下来,然后再赋 ...
- [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化
KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...
- dotNet Core开发环境搭建及简要说明
一.安装 .NET Core SDK 在 Windows 上使用 .NET Core 的最佳途径:使用Visual Studio. 免费下载地址: Visual Studio Community 20 ...
- BPM任务管理解决方案分享
一.方案概述任务是企业管理者很多意志的直接体现,对于非常规性事务较多的企业,经常存在各类公司下达的各种任务跟进难.监控难等问题,任务不是完成效果不理解,就是时间超期,甚至很多公司管理层下达的任务都不了 ...
- 【SAP业务模式】之ICS(二):基础数据
讲完业务,计划在前台做一下ICS的基本操作,不过在操作之前,得先建立好基本的基础数据. 1.首先创建接单公司LEON,对应工厂是ADA: 2.创建生产公司MXPL,对应工厂是PL01: 3.创建接单公 ...