是时候和 jQuery 说拜拜了么?

时间: 2017-11-09阅读: 351标签: jquery

自从2006年,jQuery发布以来,浏览器的API和DOM取得了长足的发展。在网络上也时不时会看到,“是时候和jQuery说拜拜了”,最著名的莫过于在2013年的这篇文章You Might Not Need jQuery。这里就不再重复的再说这个陈旧的话题,不过自从那篇文章发表后,浏览器确实在一点一点的改变着,发展着。浏览器继续发布和更新它们的API,有的是直接从jQuery那借鉴过来的。

下面就来看看一些新的可以代替jQuery方法的浏览器的API。

从页面删除一个元素

在以前如果你要使用浏览器提供的API来删除一个元素,你不得不采用迂回的方法来达到目的。比如el.parentNode.removeChild(el);,现在就不用使用这样迂回的方法了。下面就来比较下jQuery和浏览器新的API删除一个元素的使用方法。

jQuery:

var $elem = $(".someClass") //选中元素
$elem.remove(); //删除元素

使用浏览器新API:

var elem = document.querySelector(".someClass"); //选中元素
elem.remove() //删除元素

这里提醒下,如果使用了$elem这种表示方法,代表使用了jQuery;如果是elem,则表示使用的是浏览器原生的方法。

插入一个元素

jQuery:

$elem.prepend($someOtherElem);

使用浏览器新API:

elem.prepend(someOtherElem);

在指定元素前插入内容

jQuery:

$elem.before($someOtherElem);

使用浏览器新API:

elem.before(someOtherElem);

替换元素

jQuery:

$elem.replaceWith($someOtherElem);

使用浏览器新API:

elem.replaceWith(someOtherElem);

找到最近的一个元素

jQuery:

$elem.closest("div");

使用浏览器新API:

elem.closest("div");

看到了么,在新的浏览器中,提供了和jQuery几乎一模一样的方法。随着浏览器技术的发展,jQuery迟早会光荣的退出历史的舞台,在web的发展史上也会留下浓墨重彩的一笔。

下面看看各个浏览器对这些新的DOM的操作方法的支持情况,数据来自Caniuse

可以发现在桌面上支持的也还不错,主要是IE的支持情况不是很理想;而在移动端支持的比较好,可以放心大胆的使用了。

隐藏一个元素

jQuery:

$elem.fadeIn();

为了使动画更自然,通过CSS配合js,可以做一个简单的过渡渐隐渐显的效果。

.thingy {
  display: none;
  opacity: 0;
  transition: .8s;
}

使用浏览器新API:

elem.style.display = "block";
requestAnimationFrame(() => elem.style.opacity = 1);

只触发一次事件

jQuery:

$elem.one("click", someFunc);

在以前当遇到这样只触发一次事件的时候,需要用到一个回调方法来删除事件。

function dostuff() {
  alert("some stuff happened");
  this.removeEventListener("click", dostuff);
}
var button = document.querySelector("button");
button.addEventListener("click", dostuff);

现在有更加方便的方法了,只需要给addEventListener方法传入一个布尔参数就可以达到这样的目的。

elem.addEventListener('click', someFunc, { once: true, });

如果你仍然想捕获这个事件并且也只调用一次,那么你依然可以通过传入一个参数来搞定:

elem.addEventListener('click', myClickHandler, {
  once: true,
  capture: true
});

动画

虽然jQuery提供了animate的方法,但是它的功能非常有限。

$elem.animate({
  width: "70%",
  opacity: 0.4,
  marginLeft: "0.6in",
  fontSize: "3em",
  borderWidth: "10px"
}, 1500);

在jQuery的文档中有说明,所以能被运动的属性的值,应该都是可以使用数字来表示的;如上所属,如果一个属性的值,不能够用数字来表示,则不能使用jQuery的animate方法。比如当你要用transform和颜色来实现动画效果的时候,就不能使用jQuery的animate方法了。不过,浏览器提供一个新的方法Web Animations API来制作动画效果。

var elem = document.querySelector('.animate-me');
elem.animate([
  { 
    transform: 'translateY(-1000px) scaleY(2.5) scaleX(.2)', 
    transformOrigin: '50% 0', 
    filter: 'blur(40px)', 
    opacity: 0 
  },
  { 
    transform: 'translateY(0) scaleY(1) scaleX(1)',
    transformOrigin: '50% 50%',
    filter: 'blur(0)',
    opacity: 1 
  }
], 1000);

Ajax

在过去jQuery一个关键的卖点就是它的Ajax方法,jQuery把XMLHttpRequest进行了很好的封装,提供了优雅的Ajax方法,使用起来也确实非常方便:

$.ajax('https://some.url', {
  success: (data) => { /* do stuff with the data */ }
});

当然现在浏览器提供fetch API来代替XMLHttpRequest,并且现在所有的浏览器都支持它。

fetch('https://some.url')
  .then(response => response.json())
  .then(data => {
    // do stuff with the data
  });

当然fetch方法可能没有想象中的那么简单。但是,它比在以XMLHttpRequest上来建立任何功能要更加的通用和方便。

当然,我们如果要想更加的易于使用它,那可以借助与一些第三方的封装好的微型的类库...

Axios是一个非常流行的专门用来进行Ajax操作的库。非常轻量,它只专注与一件事即Ajax。虽然它们不会像jQuery一样被大规模的测试使用,但是它们确实为替代jQuery提供了可代替的选择。

虽然,按现在浏览器技术的发展,使用它们提供的DOM操作方法完全可以应付web开发工作!但还是有很多的顾虑,比如各个浏览器厂商支持程度不一样,很多的开发者为了保险起见,还是觉得使用jQuery更安全一些。大多数时候,你完全不用顾虑这么多,尽管用就是了,很多的时候只要在你的页面中引用一个 polyfill就能很好的处理那些不兼容新方法的浏览器。

只需要引入这个简单的脚步,就可以处理任何兼容问题。详细可以去它的官网看看polyfill.io

jQuery很慢吗?

当然,jQuery可能比那些写的糟糕的js要快,但是这也是你要更加好好学习javascript的理由!作为一个jQuery的主要贡献者Paul Irish曾说道:

为了有更好的性能,不要使用jQuery的hide()方法

作为jQuery的创建者,在它的一本书中Secrets of the JavaScript Ninja曾经说过这样一段话:

如果你在使用一个第三方的javascript的库的时候,你需要了解它的一个原理。最主要的一个原因是性能。了解一个库的工作原理,可以使你写出更加高性能的代码。

真的可以和jQuery说拜拜了么?

真的可以和jQuery说拜拜了么?还真不是那么容易,特别是jQuery发展了这么多年,已经形成了一个庞大的生态圈。所以现在有很多的微型库试图模仿jQuery的风格,来增加对开发者们的亲切感。

  • W3C的专家Lea Verou写过一篇文章jQuery Considered Harmful并且写了一个Bliss.js微型库。它就是模仿jQuery的语法风格$
  • Paul Irish也写过一个Bling.js脚本也是用来模仿模仿jQuery的语法风格$
  • Remy Sharp提供了一个微型脚本库min.js

当然我并不是一个jQuery反对者。现在依然还有很多非常棒的开发者选择使用jQuery。如果你已经习惯了使用它,当然可以继续使用它。现在很多的企业在招聘的时候,仍然把它作为一个必备的技能要求。不过,微软宣布了一个消息,Internet Explorer 11将是IE浏览器的最后一个版本,一旦IE退出了web的舞台,那么jQuery也可能随着IE的消亡也会推出历史舞台。到时候,jQuery可能就真多没有存在的必要了。

本文主要是从You Might Not Need jQuery这篇文章整理而来,有删减,有疏漏或者理解不到位的地方,还请多多指教!

jQuery动画的hover连续触发动画bug处理_让hover事件只触发一次动画的实现

一个简单的鼠标滑过的动画而已,但是当我测试的时候发现。事件就被触发了多次,动画也就重复了多次,怎么才能不重复出现,这是由于元素绑定hover事件之后,如果光标移入移出的速度太快,导致移入的动画还没执行完。

jQuery如何为指定标签添加和删除一个样式

在网页的实际应用中,需要根据不同的条件来改变元素的CSS样式,通过动态的给元素添加删除一个CSS类可以实现此功能,下面通过实例来介绍一下如何实现此种功能。

jquery动画实现_浅谈jQuery之动画

jQuery提供了JS未能提供的动画效果,利用jQuery的动画效果,可以极大的简化JS动画部分的逻辑,包括:滑入滑出动画、淡入淡出动画、显示隐藏动画、停止动画、自定义动画

jQuery 常用小技巧分享

整理一些简单技巧的集合,帮你提升 jQuery 技能,你可以直接拿来使用,下面内容包括:禁止右键点击、隐藏搜索文本框文字、隐藏搜索文本框文字、在新窗口中打开链接、检测浏览器...

jquery分页插件pagination.js报错pagination is not a function的bug解决方法

在使用jquery.pagination.js插件的时候,会出现pagination is not a function的错误,这是什么原因导致的呢?这里为大家整理一下,请对比自己的代码参考!

jquery的选择器有哪些?如何对元素取值和设置值

jQuery 选择器 jQuery 选择器允许您对 HTML 元素组或单个元素进行操作, Jquery 选择器包括:基本选择器、层叠选择器 、基本过滤选择器 、内容过滤选择器、可视化过滤选择器.....

原生js中DOM对象转成jQuery对象、jQuery 对象转成 DOM 对象的实现

jquery是对js语言的封装、扩展,实现了对浏览器的兼容,使用jquery能让操作更方便简洁,这篇文章主要讲解原生js中Dom对象和jquery对象的相互转换。

高版本jquery中attr和prop的区别

在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?对于HTML元素本身就带有的固有属性,在处理时,使用prop方法。对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法。

JQuery 自动触发事件

在JQuery中,可以使用trigger()方法完成模拟操作,trigger()方法不仅能触发浏览器支持的具有相同名称的事件,也可以触发自定义名称的事件。rigger(type[,data])方法有两个参数

Jquery插件开发的方法总汇

jquery插件是用来扩展jquery对象的一种方法,它的使用方法是通过jquery对象$来调用。其中Jquery插件开发一共有三种方式:$.extend(),$.fn,$.widget()