网站如何做到完全不需要jQuery也可以满足简单需求


Posted in Javascript onJune 27, 2013

jQuery 是现在最流行的 JavaScript 工具库。

据统计,目前全世界 57.3% 的网站使用它。也就是说,10 个网站里面,有 6 个使用 jQuery。如果只考察使用工具库的网站,这个比例就会上升到惊人的 91.7%。

网站如何做到完全不需要jQuery也可以满足简单需求

虽然 jQuery 如此受欢迎,但是它臃肿的体积也让人头痛不已。jQuery 2.0 的原始大小为 235KB,优化后为 81KB;如果是支持 IE6、7、8 的 jQuery 1.8.3,原始大小为 261KB,优化后为 91KB。

这样的体积,即使是宽带环境,完全加载也需要 1 秒或更长,更不要说移动设备了。这意味着,如果你使用了 jQuery,用户至少延迟 1 秒,才能看到网页效果。考虑到本质上,jQuery 只是一个操作 DOM 的工具,我们不仅要问:如果只是为了几个网页特效,是否有必要动用这么大的库?

网站如何做到完全不需要jQuery也可以满足简单需求

2006 年,jQuery 诞生的时候,主要用于消除不同浏览器的差异(主要是 IE6),为开发者提供一个简洁的统一接口。相比当时,如今的情况已经发生了很大的变化。IE 的市场份额不断下降,以 ECMAScript 为基础的 JavaScript 标准语法,正得到越来越广泛的支持。开发者直接使用 JavScript 标准语法,就能同时在各大浏览器运行,不再需要通过 jQuery 获取兼容性。

下面就探讨如何用 JavaScript 标准语法,取代 jQuery 的一些主要功能,做到 jQuery-free。

网站如何做到完全不需要jQuery也可以满足简单需求

一、选取 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

(完)

Javascript 相关文章推荐
JavaScript游戏之优化篇
Nov 08 Javascript
js运动框架_包括图片的淡入淡出效果
May 11 Javascript
jQuery实现的原图对比窗帘效果
Jun 15 Javascript
跟我学习javascript解决异步编程异常方案
Nov 23 Javascript
超全面的JavaScript开发规范(推荐)
Jan 21 Javascript
Javascript for in的缺陷总结
Feb 03 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
Feb 08 Javascript
Angularjs中使用轮播图指令swiper
May 30 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
Aug 30 Javascript
JavaScript中this的全面解析及常见实例
May 14 Javascript
微信小程序如何访问公众号文章
Jul 08 Javascript
javascript事件循环event loop的简单模型解释与应用分析
Mar 14 Javascript
js获取当前日期代码适用于网页头部
Jun 27 #Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
Jun 27 #Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
Jun 27 #Javascript
A标签触发onclick事件而不跳转的多种解决方法
Jun 27 #Javascript
artdialog的图片/标题以及关闭按钮不显示的解决方法
Jun 27 #Javascript
JQuery实现表格中相同单元格合并示例代码
Jun 26 #Javascript
基于js disabled="false"不起作用的解决办法
Jun 26 #Javascript
You might like
PHP模板解析类实例
2015/07/09 PHP
用JavaScript脚本实现Web页面信息交互
2006/12/21 Javascript
form中限制文本字节数js代码
2007/06/10 Javascript
JavaScript 克隆数组最简单的方法
2009/02/12 Javascript
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
js打印纸函数代码(递归)
2010/06/18 Javascript
JavaScript 事件系统
2010/07/22 Javascript
jQuery中操控hidden、disable等无值属性的方法
2014/01/06 Javascript
jQuery中on()方法用法实例
2015/01/19 Javascript
jQuery实现跟随鼠标运动图层效果的方法
2015/02/02 Javascript
JS+CSS实现可拖动的弹出提示框
2015/02/16 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
2017/01/30 Javascript
使用grunt合并压缩js和css文件的方法
2017/03/02 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
vue使用技巧及vue项目中遇到的问题
2018/06/04 Javascript
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
Vue加载json文件的方法简单示例
2019/01/28 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
python复制与引用用法分析
2015/04/08 Python
python+matplotlib实现鼠标移动三角形高亮及索引显示
2018/01/15 Python
浅谈python可视化包Bokeh
2018/02/07 Python
Pytorch to(device)用法
2020/01/08 Python
什么是python的函数体
2020/06/19 Python
计算机科学与技术应届生求职信
2013/11/07 职场文书
办理暂住证介绍信
2014/01/11 职场文书
小学生新学期寄语
2014/01/19 职场文书
接待员岗位责任制
2014/02/10 职场文书
端午节演讲稿
2014/05/23 职场文书
2014年租房协议书范本
2014/10/30 职场文书
子女赡养老人协议书
2016/03/23 职场文书
送给教师们,到底该如何写好教学反思?
2019/07/02 职场文书
JS的深浅复制详细
2021/10/16 Javascript
如何避免mysql启动时错误及sock文件作用分析
2022/01/22 MySQL
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL