是时候和 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:

varelem = 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);

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

functiondostuff(){alert("some stuff happened");this.removeEventListener("click", dostuff);}varbutton = 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=>{//dostuffwiththe 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这篇文章整理而来,有删减,有疏漏或者理解不到位的地方,还请多多指教!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容

  • 原文链接 http://blog.poetries.top/2016/10/20/review-jQuery 关注...
    程序员poetry阅读 16,643评论 18 503
  • 通过jQuery,您可以选取(查询,query)HTML元素,并对它们执行“操作”(actions)。 jQuer...
    枇杷树8824阅读 656评论 0 3
  • jQuery是一套跨浏览器的JavaScript库,简化HTML与JavaScript之间的操作。由约翰·雷西格(...
    静候那一米阳光阅读 786评论 0 18
  • 在线阅读 http://interview.poetries.top[http://interview.poetr...
    程序员poetry阅读 114,379评论 24 450
  • 昨天听了第三周周一的课,用零极限清理内心。 今天是善男信女的美好情人节! 我就是我最好的情人!心里虽然这样想,但我...
    莞尔的人生阅读 388评论 0 0