Introduction

正如jQuery所宣称的一样,Write Less, Do More。很多时候我们喜欢用它来解决问题。但增加一个库必然意味着更大的网络负担,意味着更高的页面初始载入时间。并且,现在与当初已经有了很大不同,jQuery是伴随着IE6出来的,当时,jQuery在跨浏览器开发上有不可替代的作用。但今天,伴随ES5的广泛被支持以及各个浏览器本身的完善,我们可以考虑适当的丢掉它,改善性能。

需要注意的是,并不是说jQuery是不可取的,在某些场合,用它是更合适的,需要我们自己判断。

Listening for Document Ready

我们经常用到$( document ).ready() 或者它的简写 $(),用来传入当所有dom准备完毕后,执行逻辑的相关回调。原生js可以这么写:

document.addEventListener('DOMContentLoaded', function () {
// dom 已经准备好被操作了
});

Selecting elements

我们常常依赖于jQuery的选择器,而现在,所有的浏览器基本都支持了querySelectorquerySelectorAll这里是MDN链接

var lochNess = document.querySelector(".monsters");
console.log("It's from Scotland - " + lochNess.textContent); var scary = document.querySelectorAll(".monsters");
for (var i = 0; i < scary.length; i++) {
console.log(scary[i].innerHTML);
}

Attaching and removing event listeners

侦听事件是web开发中再重要不过的一环。曾经IE独树一帜,与其它浏览器提供的API不一致,导致需要用jQuery来快速开发,现在,所有的浏览器都提供了addEventListener:

var btn = document.querySelectorAll("button"),

btn[0].addEventListener("click", function () {
list.addEventListener("mouseover", enlarge);
}); btn[1].addEventListener("click", function () {
list.removeEventListener("mouseover", enlarge);
});

Manipulating classes and attributes

曾经,不使用jQuery来处理class是一件很麻烦的事情,而现在,由于classList的存在(这里是MDB链接)我们可以快捷的解决这一类问题,另外,如果需要操作attribute,可以使用setAttribute(同样是MDN链接)

var btn = document.querySelectorAll("button"),
div = document.querySelector("#myDiv"); btn[0].addEventListener("click", function () {
//可以获取任意的属性
console.log(div.id);
}); // Element.classList存放了所有当前元素的class
var classes = div.classList; btn[1].addEventListener("click", function () {
console.log(classes);
}); btn[2].addEventListener("click", function () {
//可以添加,删除
classes.add("red");
}); btn[3].addEventListener("click", function () {
//也可以翻转
classes.toggle("hidden");
});

Getting and setting element content

jQuery提供了text() html()用以操作元素的内容,我们可以使用原生的textContent与innerHTML属性代替它们。

var myText = document.querySelector("#myParagraph"),
btn = document.querySelectorAll("button"); // 获取
var myContent = myText.textContent;
console.log("textContent: " + myContent); // 改变
btn[0].addEventListener('click', function () {
myText.textContent = " Koalas are the best animals ";
}); var myHtml = myText.innerHTML;
console.log("innerHTML: " + myHtml); btn[1].addEventListener('click', function () {
myText.innerHTML = "<button> Penguins are the best animals </button>";
});

Inserting and removing elements

原生的js可以这样添加与删除元素:

var lunch = document.querySelector("#lunch");

// 添加
var fries = document.createElement("div");
fries.innerHTML = '<li><h4> Fries </h4></li>';
lunch.appendChild(fries); // 特定位置添加 var beef = document.querySelector("#Beef"), topSlice = document.createElement("li"),
bottomSlice = document.createElement("li"); bottomSlice.innerHTML = topSlice.innerHTML = 'Cheese'; beef.parentNode.insertBefore(topSlice, beef);
beef.parentNode.insertBefore(bottomSlice, beef.nextSibling);
}; //删除
var pickles = document.querySelector("#pickles");
if (pickles) {
pickles.parentNode.removeChild(pickles);
}

Walking the DOM tree

原生的js也可以遍历DOM树

var snakes = document.querySelector('#snakes'),
birds = document.querySelector('#birds'); snakes.addEventListener('click', function (e) {
console.log("Children: ");
var children = e.target.children;
for (var i = 0; i < children.length; i++) {
console.log(children[i].textContent);
}
}); birds.addEventListener('click', function (e) {
// 获取最近的兄弟节点
var previous = e.target.previousElementSibling;
if (previous) {
console.log("Previous sibling: " + previous.textContent);
}
var next = e.target.nextElementSibling;
if (next) {
console.log("Next sibling: " + next.textContent);
} //所有的兄弟们
Array.prototype.filter.call(e.target.parentNode.children, function (child) {
if (child !== e.target) {
console.log(child.textContent);
}
}); });

Looping over arrays

jQuery提供的 each与map已经可以被ES5的forEach与map替代

var ninjaTurtles = ["Donatello", "Leonardo", "Michelangelo", "Raphael"];

ninjaTurtles.forEach(function (entry) {
console.log(entry);
}); var lovesPizza = ninjaTurtles.map(function (entry) {
return entry.concat(" loves pizza!");
});
console.log(lovesPizza);

Animations

jQuery的动画效果是非常强大的,在很多场合还是很难替代的,不过,由于CSS3,动画可以转到由CSS来实现。这部分就不给DEMO了。

AJAX

如果唯一使用jQuery的唯一理由,是它便捷的AJAX,那么,将jQuery替换成一个轻量的多的库吧!比如reqwest,这个库压缩后不到10kB。

总结

尽全力使脚本变的更小,可以使用户获得更高的加载速度,以及更好的用户体验。但也要谨慎的做取舍,没必要大量的造jQuery已经提供的轮子。

除了在编码方面带来性能优化,我们还可以借助工具达到同样的效果。可以看一看博主的webpack方面的文章

最新文章

  1. Android APP压力测试(二)之Monkey信息自动收集脚本
  2. 背水一战 Windows 10 (29) - 控件(文本类): RichTextBlock, RichTextBlockOverflow, RichEditBox
  3. [HIMCM暑期班]第3课:一个博弈问题
  4. MurmurHash算法:高运算性能,低碰撞率的hash算法
  5. Java起源、发展历程、环境变量、第一个Java程序等【1】
  6. mysql没有delete操作,那是delete from操作,
  7. 如何让 .Net Console 控制台显示界面在最上层
  8. 破解Inode客户端使用笔记本共享WIFI
  9. cocos2d-x3.x 设计与实现弹出对话框
  10. 接口速度慢问题查找(TTFB时间长)
  11. Weex系列二、显示图片
  12. Codeforces Round #452 E. New Year and Old Subsequence
  13. SpriteKit给游戏弹跳角色添加一个高度标示器
  14. c# 程序只能运行一次(多次运行只能打开同一个程序)
  15. mybatis抽取出的工具-(一)通用标记解析器(即拿即用)
  16. Item 19: 使用srd::shared_ptr来管理共享所有权的资源
  17. ssh-key 与 git账户配置以及多账户配置,以及通信方式从https切换到ssh
  18. BZOJ4319 cerc2008 Suffix reconstruction 字符串 SA
  19. Css3新属性:calc()
  20. Zephyr的Power Management

热门文章

  1. uglifyjs2全局混淆
  2. 静态路由配置及RIP配置实验
  3. 字面量(literal)与 C 语言复合字面量(compound literals)
  4. P2383 狗哥玩木棒
  5. tinymix
  6. phpStorm的远端部署
  7. Android Studio3.0中dependencies依赖由compile变为implementation的区别
  8. JAVA 中的堆和栈
  9. bzoj3456
  10. Asset Catalog Help (六)---Adding OS X Icons