如何做到 jQuery-free?
jQuery是现在最流行的JavaScript工具库。
据统计,目前全世界57.3%的网站使用它。也就是说,10个网站里面,有6个使用jQuery。如果只考察使用工具库的网站,这个比例就会上升到惊人的91.7%。
虽然jQuery如此受欢迎,但是它臃肿的体积也让人头痛不已。jQuery 2.0的原始大小为235KB,优化后为81KB;如果是支持IE6、7、8的jQuery 1.8.3,原始大小为261KB,优化后为91KB。
这样的体积,即使是宽带环境,完全加载也需要1秒或更长,更不要说移动设备了。这意味着,如果你使用了jQuery,用户至少延迟1秒,才能看到网 页效果。考虑到本质上,jQuery只是一个操作DOM的工具,我们不仅要问:如果只是为了几个网页特效,是否有必要动用这么大的库?
2006年,jQuery诞生的时候,主要用于消除不同浏览器的差异(主要是IE6),为开发者提供一个简洁的统一接口。相比当时,如今的情况已经发生了很大的变化。IE的市场份额不断下降,以ECMAScript为基础的JavaScript标准语法,正得到越来越广泛的支持。开发者直接使用JavScript标准语法,就能同时在各大浏览器运行,不再需要通过jQuery获取兼容性。
下面就探讨如何用JavaScript标准语法,取代jQuery的一些主要功能,做到jQuery-free。
一、选取DOM元素
jQuery的核心是通过各种选择器,选中DOM元素,可以用querySelectorAll方法模拟这个功能。
var $ = document.querySelectorAll.bind(document);
这里需要注意的是,querySelectorAll方法返回的是NodeList对象,它很像数组(有数字索引和length属性),但不是数组,不能使用pop、push等数组特有方法。如果有需要,可以考虑将Nodelist对象转为数组。
myList = Array.prototype.slice.call(myNodeList);
二、DOM操作
DOM本身就具有很丰富的操作方法,可以取代jQuery提供的操作方法。
尾部追加DOM元素。
// jQuery写法 $(parent).append($(child));// DOM写法 parent.appendChild(child)
头部插入DOM元素。
// jQuery写法 $(parent).prepend($(child));// DOM写法 parent.insertBefore(child, parent.childNodes[0])
删除DOM元素。
// jQuery写法 $(child).remove()// DOM写法 child.parentNode.removeChild(child)
三、事件的监听
jQuery的on方法,完全可以用addEventListener模拟。
Element.prototype.on = Element.prototype.addEventListener;
为了使用方便,可以在NodeList对象上也部署这个方法。
NodeList.prototype.on = function (event, fn) {[]['forEach'].call(this, function (el) {el.on(event, fn);});return this; };
四、事件的触发
jQuery的trigger方法则需要单独部署,相对复杂一些。
Element.prototype.trigger = function (type, data) {var event = document.createEvent('HTMLEvents');event.initEvent(type, true, true);event.data = data || {};event.eventName = type;event.target = this;this.dispatchEvent(event);return this;};
在NodeList对象上也部署这个方法。
NodeList.prototype.trigger = function (event) {[]['forEach'].call(this, function (el) {el['trigger'](event);});return this;};
五、document.ready
目前的最佳实践,是将JavaScript脚本文件都放在页面底部加载。这样的话,其实document.ready方法(jQuery简写为$(function))已经不必要了,因为等到运行的时候,DOM对象已经生成了。
六、attr方法
jQuery使用attr方法,读写网页元素的属性。
$("#picture").attr("src", "http://url/to/image");
DOM元素允许直接读取属性值,写法要简洁许多。
$("#picture").src = "http://url/to/image";
需要注意,input元素的this.value返回的是输入框中的值,链接元素的this.href返回的是绝对URL。如果需要用到这两个网页 元素的属性准确值,可以用this.getAttribute('value')和this.getAttibute('href')。
七、addClass方法
jQuery的addClass方法,用于为DOM元素添加一个class。
$('body').addClass('hasJS');
DOM元素本身有一个可读写的className属性,可以用来操作class。
document.body.className = 'hasJS'; // or document.body.className += ' hasJS';
HTML 5还提供一个classList对象,功能更强大(IE 9不支持)。
document.body.classList.add('hasJS'); document.body.classList.remove('hasJS'); document.body.classList.toggle('hasJS'); document.body.classList.contains('hasJS');
八、CSS
jQuery的css方法,用来设置网页元素的样式。
$(node).css( "color", "red" );
DOM元素有一个style属性,可以直接操作。
element.style.color = "red";; // or element.style.cssText += 'color:red';
九、数据储存
jQuery对象可以储存数据。
$("body").data("foo", 52);
HTML 5有一个dataset对象,也有类似的功能(IE 10不支持),不过只能保存字符串。
element.dataset.user = JSON.stringify(user); element.dataset.score = score;
十、Ajax
jQuery的Ajax方法,用于异步操作。
$.ajax({type: "POST",url: "some.php",data: { name: "John", location: "Boston" }}).done(function( msg ) {alert( "Data Saved: " + msg );});
我们可以定义一个request函数,模拟Ajax方法。
function request(type, url, opts, callback) {var xhr = new XMLHttpRequest();if (typeof opts === 'function') {callback = opts;opts = null;}xhr.open(type, url);var fd = new FormData();if (type === 'POST' && opts) {for (var key in opts) {fd.append(key, JSON.stringify(opts[key]));}}xhr.onload = function () {callback(JSON.parse(xhr.response));};xhr.send(opts ? fd : null);}
然后,基于request函数,模拟jQuery的get和post方法。
var get = request.bind(this, 'GET'); var post = request.bind(this, 'POST');
十一、动画
jQuery的animate方法,用于生成动画效果。
$foo.animate('slow', { x: '+=10px' });
jQuery的动画效果,很大部分基于DOM。但是目前,CSS 3的动画远比DOM强大,所以可以把动画效果写进CSS,然后通过操作DOM元素的class,来展示动画。
foo.classList.add('animate');
如果需要对动画使用回调函数,CSS 3也定义了相应的事件。
el.addEventListener("webkitTransitionEnd", transitionEnded); el.addEventListener("transitionend", transitionEnded);
十二、替代方案
由于jQuery体积过大,替代方案层出不穷。
其中,最有名的是zepto.js。它的设计目标是以最小的体积,做到最大兼容jQuery的API。zepto.js 1.0版的原始大小是55KB,优化后是29KB,gzip压缩后为10KB。
如果不求最大兼容,只希望模拟jQuery的基本功能,那么,min.js优化后只有200字节,而dolla优化后是1.7KB。
此外,jQuery本身采用模块设计,可以只选择使用自己需要的模块。具体做法参见它的github网站,或者使用专用的Web界面。
十三、参考链接
- Remy Sharp,I know jQuery. Now what?
- Hemanth.HM,Power of Vanilla JS
- Burke Holland,5 Things You Should Stop Doing With jQuery
(完)
转自:阮一峰的网络日志
如何做到 jQuery-free?相关推荐
- Ajax接收Java异常_java – 处理来自Servlet的Jquery AJAX响应中的异常
我的servlet代码是 try{ //something response.setStatus(201); out.print("Data successfully saved" ...
- Jquery DIV滚动至浏览器顶部后固定不动代码
获取元素(这里定位元素A)距离顶部的高度,接着设定scroll滚动的事件,比如超过那个高度,把A的位置设定为fixed,小于该高度,修改回relative. 效果例1 代码如下复制代码 <scr ...
- jquery.raty评星插件
<!DOCTYPE html> <html><head><meta charset="utf-8" /><title>j ...
- jquery autocomplete demo
根据用户输入值进行搜索和过滤,让用户快速找到并从预设值列表中选择. jquery.autocomplete参考地址 http://bassistance.de/jquery-plugins/jquer ...
- 在Ant-design-pro框架中引入jQuery和jQuery-ui步骤
1.安装jQuery和jQuery-ui npm i jquery s npm i jquery-ui s yarn install 2.在vue.config.js中进行配置 // webpack ...
- 火狐浏览器允许ajax,解决火狐浏览器发送jquery的ajax请求无效的问题
今天遇到这样一个问题: 页面在chrome下发送ajax的请求是没有问题的,但是在firfox下无效. 代码大致如下: //前面省略 ..... 生成成绩 查询成绩 ...... ...... fun ...
- jquery 监听的案例
jQuery 简介 jQuery 是一个 JavaScript 库. jQuery 使用 可以下载一个,也可以使用Staticfile CDN.百度.又拍云.新浪.谷歌和微软的服务器都存有 jQuer ...
- 网站项目必备——12款白富美型 jQuery 图片轮播插件
转自:http://www.cnblogs.com/lhb25/archive/2013/01/06/jquery-image-carousel-effect.html 图片轮播是网站中的常用功能,用 ...
- 利用 jquery 获取某个元素下的所有图片并改变其属性
HTML代码 <div id="mochu"> <p>内容....<./p> <p><img src="xxxx.p ...
- 通过jQuery调用ASP.NET的AJAX
传统上,在ASP.NET页面中实现AJAX的方法是拖放一个ScriptManager控件,并进行一系列的设置和相关编程.但事实上,这并不是理想的解决方案.使用jQuery来调用ASP.NET后台的方法 ...
最新文章
- 关于回调函数的那点事
- 通过base标签实现全网页新窗口链接。
- 读写Excel 用 xlsxwriter,openpyxl 更灵活
- java 并发测试main方法_Java并发测试
- 静态内部类 java 1614958017
- 经纪xx系统节点VIP案例介绍和深入分析异常
- 如何在SQL Server中创建SQL依赖关系图
- 要让人人能AI的百度EasyDL,现在怎么样了?
- Android Handler机制之总目录
- ES6、7学习笔记(尚硅谷)-5-箭头函数
- nginx limit_req限速设置
- 论文校对错别字检测工具
- Windows/Mac系统MySQL,MySQL驱动下载和安装
- 计算机网络:学习笔记(持续更新)
- 牛逼顿的一生:当智商高到一定程度,情商就不重要了
- 十进制如何转化为二进制和六进制
- Hive收集函数和转换函数
- 透明背景怎么在线抠出来?聪明的朋友都用这个
- 多线程,了解-概念-实现方式-常见方法-安全问题-死锁-生产者消费者
- 通过cmd处理汉王酷学手写板在Win10x64下时而失灵的问题
热门文章
- 骨牌铺方格(HDU-2046)
- 基础算法 —— 排序算法
- 执行器接线图_风机盘管组装全过程,盘管与接管接线图,拿走不谢!
- 苹果保修期_iPhone 保修期内哪些情况可以获得免费维修?
- linux内核那些事之Memory protection keys(硬件原理)
- [Pytorch] BCELoss和BCEWithLogitsLoss(Sigmoid-BCELoss合成为一步)
- CUDA11.1安装教程(python3.8)
- 序列化 自定义名字_反序列化漏洞(Web漏洞及防御)
- VSCode如何关闭右侧预览功能 - 截图示下
- vue-router配置介绍和使用方法(一)