如今技术日新月异,各类框架库也是层次不穷。即便当年漫山红遍的JQuery(让开发者write less, do more,So Perfect!!)如今也有被替代的大势。但JS原生API写法依旧;并且有时候只不过小写一个Demo,或者产品中只有少量的前端效果或DOM操作,就去花时间&空间引入jQuery,或者React?不免有取宰牛之刀以杀鸡之嫌。

原文首链:http://www.jeffjade.com/2015/11/25/2015-11-31-jQuery-vs-javaScript/

在jQuery的温柔乡里,是否还能记得原生她javascript原生?如果仅为使用个选择器($)或者类似的东西,是否真的有必要加载jQuery?故此了解下JS常用原生写法还是蛮有必要的。

[update-2015-12-07]有看到抛弃jQuery,拥抱原生JavaScript一文中提到,jQuery 代表着传统的以 DOM 为中心的开发模式,但现在复杂页面开发流行的是以 React 为代表的以数据/状态为中心的开发模式; React、Angular、Vue 等框架的流行,直接操作 DOM 不再是好的模式,jQuery 使用场景大大减少。

Talk is cheap. Show me the code.直接看代码;以下是jQuery和JavaScript实现相同操作的等价代码:

选择元素

  1. // jQuery
  2. var els = $('.el');
  3. //==========================================================//
  4. // 原生方法
  5. var els = document.querySelectorAll('.el');
  6. // 函数法
  7. var $ = function (el) {
  8. return document.querySelectorAll(el);
  9. }
  10. var els = $('.el');

创建元素

  1. // jQuery
  2. var newEl = $('<div/>');
  3. //==========================================================//
  4. // 原生方法
  5. var newEl = document.createElement('div');

添加/移除/切换类

  1. // jQuery
  2. $('.el').addClass('class');
  3. $('.el').removeClass('class');
  4. $('.el').toggleClass('class');
  5. //==========================================================//
  6. // 原生方法
  7. document.querySelector('.el').classList.add('class');
  8. document.querySelector('.el').classList.remove('class');
  9. document.querySelector('.el').classList.toggle('class');

判断是否包含类

  1. // jQuery
  2. $('.el').hasClass('className');
  3. $('.el').has('.className'); //也可以用来 判断是否包含某个元素
  4. //==========================================================//
  5. // 原生方法(1)
  6. _hasClass(document.querySelector('.el'), className);
  7. function _hasClass( elements,cName ){
  8. return !!elements.className.match( new RegExp( "(\\s|^)" + cName + "(\\s|$)") );
  9. };
  10. // 原生方法(2)
  11. if(el.classList.contains("someClass")){}

添加事件监听器

  1. // jQuery
  2. $('.el').on('event', function() {
  3. });
  4. //==========================================================//
  5. // 原生方法
  6. [].forEach.call(document.querySelectorAll('.el'), function (el) {
  7. el.addEventListener('event', function() {
  8. }, false);
  9. });

原生-DOM绑定事件-优化1参考HERE

  1. //DOM绑定事件-之自执行
  2. var BindEvent = (function () {
  3. if ('addEventListener' in document) {
  4. return function (dom, event, handle, ex) {
  5. dom.addEventListener(event, handle, ex || false);
  6. }
  7. } else if ('attachEvent' in document) {
  8. return function (dom, event, handle) {
  9. dom.attachEvent('on' + event, handle);
  10. }
  11. } else {
  12. return function (dom, event, handle) {
  13. dom['on' + event] = handle;
  14. }
  15. }
  16. })();

原生-DOM绑定事件-优化2

  1. //DOM绑定事件-之惰性加载(调用方去触发BindEvent之时才去做初始化)//
  2. var BindEvent = function (dom, event, handle, ex) {
  3. if ('addEventListener' in document) {
  4. BindEvent = function (dom, event, handle, ex) {
  5. dom.addEventListener(event, handle, ex || false);
  6. }
  7. } else if ('attachEvent' in document) {
  8. BindEvent = function (dom, event, handle) {
  9. dom.attachEvent('on' + event, handle);
  10. }
  11. } else {
  12. BindEvent = function (dom, event, handle) {
  13. dom['on' + event] = handle;
  14. }
  15. }
  16. BindEvent(dom, event, handle, ex);
  17. };

设置/获取属性

  1. // jQuery
  2. $('.el').filter(':first').attr('key', 'value');
  3. $('.el').filter(':first').attr('key');
  4. //==========================================================//
  5. // 原生方法
  6. document.querySelector('.el').setAttribute('key', 'value');
  7. document.querySelector('.el').getAttribute('key');

附加内容(Append)

  1. // jQuery
  2. $('.el').append($('<div/>'));
  3. //==========================================================//
  4. // 原生方法
  5. document.querySelector('.el').appendChild(document.createElement('div'));

克隆元素

  1. // jQuery
  2. var clonedEl = $('.el').clone();
  3. //==========================================================//
  4. // 原生方法
  5. var clonedEl = document.querySelector('.el').cloneNode(true);

移除元素

  1. // jQuery
  2. $('.el').remove();
  3. //==========================================================//
  4. // 原生方法
  5. remove('.el');
  6. function remove(el) {
  7. var toRemove = document.querySelector(el);
  8. toRemove.parentNode.removeChild(toRemove);
  9. }

获取父元素

  1. // jQuery
  2. $('.el').parent();
  3. //==========================================================//
  4. // 原生方法
  5. document.querySelector('.el').parentNode;

上一个/下一个元素

  1. // jQuery
  2. $('.el').prev();
  3. $('.el').next();
  4. //==========================================================//
  5. // 原生方法
  6. document.querySelector('.el').previousElementSibling;
  7. document.querySelector('.el').nextElementSibling;

修改CSS属性

总是通过Javascript修改和检索CSS属性,这样会比使用jQuery CSS函数更加简单快速,并且没有任何不必要的代码。

  1. //----设置CSS属性----
  2. /* jQuery */
  3. $(el).css({
  4. background: "#FF0000",
  5. "box-shadow": "1px 1px 5px 5px red",
  6. width: "100px",
  7. height: "100px",
  8. display: "block"
  9. });
  10. //==========================================================//
  11. /* 原生 */
  12. var el = document.querySelector(".main-content");
  13. el.style.background = "#FF0000";
  14. el.style.width = "100px";
  15. el.style.height = "100px";
  16. el.style.display = "block";
  17. el.style.boxShadow = "1px 1px 5px 5px red";

XHR或AJAX

  1. // jQuery
  2. $.get('url', function (data) {
  3. });
  4. $.post('url', {data: data}, function (data) {
  5. });
  6. //==========================================================//
  7. // 原生方法
  8. // get
  9. var xhr = new XMLHttpRequest();
  10. xhr.open('GET', url);
  11. xhr.onreadystatechange = function (data) {
  12. }
  13. xhr.send();
  14. // post
  15. var xhr = new XMLHttpRequest()
  16. xhr.open('POST', url);
  17. xhr.onreadystatechange = function (data) {
  18. }
  19. xhr.send({data: data});

参考文章:http://www.iteye.com/news/28503

英文原文:http://blog.romanliutikov.com/post/63383858003/how-to-forget-about-jquery-and-start-using-native

jQuery? 回归JavaScript原生API的更多相关文章

  1. javascript原生API总结

    一.查找: getElementById() 方法返回带有指定 ID 的元素(唯一): getElementsByTagName() 返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组). ...

  2. 抛弃jQuery,拥抱原生JavaScript

    前端发展很快,现代浏览器原生 API 已经足够好用.我们并不需要为了操作 DOM.Event 等再学习一下 jQuery 的 API.同时由于 React.Angular.Vue 等框架的流行,直接操 ...

  3. jQuery 事件绑定 和 JavaScript 原生事件绑定

    总结一下:jQuery 事件绑定 和 JavaScript 原生事件绑定 及 区别 jQuery 事件绑定 jQuery 中提供了四种事件监听绑定方式,分别是 bind.live.delegate.o ...

  4. 你可能不需要 jQuery!使用原生 JavaScript 进行开发

    很多的 JavaScript 开发人员,包括我在内,都很喜欢 jQuery.因为它的简单,因为它有很多丰富的插件可供使用,和其它优秀的工具一样,jQuery 让我们开发人员能够更轻松的开发网站和 We ...

  5. JavaScript原生DOM操作API总结

    最近面试的时候被这个问题给卡了,所以抽时间好好复习一下. 原文:http://www.cnblogs.com/liuxianan/p/javascript-dom-api.html 几种对象 Node ...

  6. 【转】NativeScript的工作原理:用JavaScript调用原生API实现跨平台

    原文:https://blog.csdn.net/qq_21298703/article/details/44982547 -------------------------------------- ...

  7. 使用JavaScript调用手机平台上的原生API

    我之前曾经写过一篇文章使用Cordova将您的前端JavaScript应用打包成手机原生应用,介绍了如何使用Cordova框架将您的用JavaScript和HTML开发的前端应用打包成某个手机平台(比 ...

  8. JavaScript Sanitizer API:原生WEB安全API出现啦

    10月18号, W3C中网络平台孵化器小组(Web Platform Incubator Community Group)公布了HTML Sanitizer API的规范草案.这份草案用来解决浏览器如 ...

  9. javascript的api设计原则

    前言 本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块.系卤煮自己总结的一些经验和教训.本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来.很难做到 ...

随机推荐

  1. ABP文档 - Javascript Api - Message

    本节内容: 显示信息 确认 Message API给用户显示一个信息,或从用户那里获取一个确认信息. Message API默认使用sweetalert实现,为使sweetalert正常工作,你应该包 ...

  2. Dapper扩展之~~~Dapper.Contrib

    平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4822808.html#skill 上一篇文章:Dapper逆天入门~强类型,动态类型 ...

  3. HTML DOM 介绍

    本篇主要介绍DOM内容.DOM 节点.节点属性以及获取HTML元素的方法. 目录 1. 介绍 DOM:介绍DOM,以及对DOM分类和功能的说明. 2. DOM 节点:介绍DOM节点分类和节点层次. 3 ...

  4. python爬取github数据

    爬虫流程 在上周写完用scrapy爬去知乎用户信息的爬虫之后,github上star个数一下就在公司小组内部排的上名次了,我还信誓旦旦的跟上级吹牛皮说如果再写一个,都不好意思和你再提star了,怕你们 ...

  5. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整(续)-使用配置文件动态注入

    上次实现了依赖注入,但是web项目必须要引用业务逻辑层和数据存储层的实现,项目解耦并不完全:另一方面,要同时注入业务逻辑层和数据访问层,注入的服务直接写在Startup中显得非常臃肿.理想的方式是,w ...

  6. 从零开始编写自己的C#框架(26)——小结

    一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...

  7. javascript匹配各种括号书写是否正确

    今天在codewars上做了一道题,如下 看上去就是验证三种括号各种嵌套是否正确书写,本来一头雾水,一种括号很容易判断, 但是三种怎么判断! 本人只是个前端菜鸟,,不会什么高深的正则之类的. 于是,在 ...

  8. .net 大型分布式电子商务架构说明

    .net大型分布式电子商务架构说明 背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便 ...

  9. hadoop2.7之Mapper/reducer源码分析

    一切从示例程序开始: 示例程序 Hadoop2.7 提供的示例程序WordCount.java package org.apache.hadoop.examples; import java.io.I ...

  10. thinkphp数据的查询和截取

    public function NewsList(){ $this->assign('title','news'); $p = I('page',1); $listRows = 6; $News ...