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?相关推荐

  1. Ajax接收Java异常_java – 处理来自Servlet的Jquery AJAX响应中的异常

    我的servlet代码是 try{ //something response.setStatus(201); out.print("Data successfully saved" ...

  2. Jquery DIV滚动至浏览器顶部后固定不动代码

    获取元素(这里定位元素A)距离顶部的高度,接着设定scroll滚动的事件,比如超过那个高度,把A的位置设定为fixed,小于该高度,修改回relative. 效果例1 代码如下复制代码 <scr ...

  3. jquery.raty评星插件

    <!DOCTYPE html> <html><head><meta charset="utf-8" /><title>j ...

  4. jquery autocomplete demo

    根据用户输入值进行搜索和过滤,让用户快速找到并从预设值列表中选择. jquery.autocomplete参考地址 http://bassistance.de/jquery-plugins/jquer ...

  5. 在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 ...

  6. 火狐浏览器允许ajax,解决火狐浏览器发送jquery的ajax请求无效的问题

    今天遇到这样一个问题: 页面在chrome下发送ajax的请求是没有问题的,但是在firfox下无效. 代码大致如下: //前面省略 ..... 生成成绩 查询成绩 ...... ...... fun ...

  7. jquery 监听的案例

    jQuery 简介 jQuery 是一个 JavaScript 库. jQuery 使用 可以下载一个,也可以使用Staticfile CDN.百度.又拍云.新浪.谷歌和微软的服务器都存有 jQuer ...

  8. 网站项目必备——12款白富美型 jQuery 图片轮播插件

    转自:http://www.cnblogs.com/lhb25/archive/2013/01/06/jquery-image-carousel-effect.html 图片轮播是网站中的常用功能,用 ...

  9. 利用 jquery 获取某个元素下的所有图片并改变其属性

    HTML代码 <div id="mochu"> <p>内容....<./p> <p><img src="xxxx.p ...

  10. 通过jQuery调用ASP.NET的AJAX

    传统上,在ASP.NET页面中实现AJAX的方法是拖放一个ScriptManager控件,并进行一系列的设置和相关编程.但事实上,这并不是理想的解决方案.使用jQuery来调用ASP.NET后台的方法 ...

最新文章

  1. 关于回调函数的那点事
  2. 通过base标签实现全网页新窗口链接。
  3. 读写Excel 用 xlsxwriter,openpyxl 更灵活
  4. java 并发测试main方法_Java并发测试
  5. 静态内部类 java 1614958017
  6. 经纪xx系统节点VIP案例介绍和深入分析异常
  7. 如何在SQL Server中创建SQL依赖关系图
  8. 要让人人能AI的百度EasyDL,现在怎么样了?
  9. Android Handler机制之总目录
  10. ES6、7学习笔记(尚硅谷)-5-箭头函数
  11. nginx limit_req限速设置
  12. 论文校对错别字检测工具
  13. Windows/Mac系统MySQL,MySQL驱动下载和安装
  14. 计算机网络:学习笔记(持续更新)
  15. 牛逼顿的一生:当智商高到一定程度,情商就不重要了
  16. 十进制如何转化为二进制和六进制
  17. Hive收集函数和转换函数
  18. 透明背景怎么在线抠出来?聪明的朋友都用这个
  19. 多线程,了解-概念-实现方式-常见方法-安全问题-死锁-生产者消费者
  20. 通过cmd处理汉王酷学手写板在Win10x64下时而失灵的问题

热门文章

  1. 骨牌铺方格(HDU-2046)
  2. 基础算法 —— 排序算法
  3. 执行器接线图_风机盘管组装全过程,盘管与接管接线图,拿走不谢!
  4. 苹果保修期_iPhone 保修期内哪些情况可以获得免费维修?
  5. linux内核那些事之Memory protection keys(硬件原理)
  6. [Pytorch] BCELoss和BCEWithLogitsLoss(Sigmoid-BCELoss合成为一步)
  7. CUDA11.1安装教程(python3.8)
  8. 序列化 自定义名字_反序列化漏洞(Web漏洞及防御)
  9. VSCode如何关闭右侧预览功能 - 截图示下
  10. vue-router配置介绍和使用方法(一)