oneuijs/You-Dont-Need-jQuery

 https://github.com/oneuijs/You-Dont-Need-jQuery/blob/master/README.zh-CN.md

You Don't Need jQuery

前端发展很快,现代浏览器原生 API 已经足够好用。我们并不需要为了操作 DOM、Event 等再学习一下 jQuery 的 API。同时由于 React、Angular、Vue 等框架的流行,直接操作 DOM 不再是好的模式,jQuery 使用场景大大减少。本项目总结了大部分 jQuery API 替代的方法,暂时只支持 IE10+ 以上浏览器。

Translations

Query Selector

常用的 class、id、属性 选择器都可以使用 document.querySelector 或 document.querySelectorAll 替代。区别是

  • document.querySelector 返回第一个匹配的 Element
  • document.querySelectorAll 返回所有匹配的 Element 组成的 NodeList。它可以通过 [].slice.call() 把它转成 Array
  • 如果匹配不到任何 Element,jQuery 返回空数组 [],但 document.querySelector 返回 null,注意空指针异常。当找不到时,也可以使用 || 设置默认的值,如 document.querySelectorAll(selector) || []

注意:document.querySelector 和 document.querySelectorAll 性能很。如果想提高性能,尽量使用 document.getElementByIddocument.getElementsByClassName 或 document.getElementsByTagName

  • 1.0 Query by selector

    // jQuery
    (selector); // Native
    document.querySelectorAll(selector);
  • 1.1 Query by class

    // jQuery
    (); // Native
    document.querySelectorAll(); document.getElementsByClassName();
  • 1.2 Query by id

    // jQuery
    (); // Native
    document.querySelector(); document.getElementById();
  • 1.3 Query by attribute

    // jQuery
    (a[target=_blank]); // Native
    document.querySelectorAll(a[target=_blank]);
  • 1.4 Find sth.

    • Find nodes

      // jQuery
      .(); // Native
      .querySelectorAll();
    • Find body

      // jQuery
      (); // Native
      document.;
    • Find Attribute

      // jQuery
      .(); // Native
      .getAttribute();
    • Find data attribute

      // jQuery
      .(); // Native
      // using getAttribute
      .getAttribute(data-foo);
      // you can also use `dataset` if only need to support IE 11+
      .dataset[];
  • 1.5 Sibling/Previous/Next Elements

    • Sibling elements

      // jQuery
      .siblings(); // Native
      [].filter.(.parentNode.children, function(child) {
      return child el;
      });
    • Previous elements

      // jQuery
      .(); // Native
      .previousElementSibling;
    • Next elements

      // next
      .();
      .nextElementSibling;
  • 1.6 Closest

    Closest 获得匹配选择器的第一个祖先元素,从当前元素开始沿 DOM 树向上。

    // jQuery
    .closest(queryString); // Native
    function closest(, selector) {
    const matchesSelector .matches .webkitMatchesSelector .mozMatchesSelector .msMatchesSelector; while (el) {
    (matchesSelector.(el, selector)) {
    return el;
    } {
    el .parentElement;
    }
    }
    return ;
    }
  • 1.7 Parents Until

    获取当前每一个匹配元素集的祖先,不包括匹配元素的本身。

    // jQuery
    .parentsUntil(selector, filter); // Native
    function parentsUntil(, selector, filter) {
    const result [];
    const matchesSelector .matches .webkitMatchesSelector .mozMatchesSelector .msMatchesSelector; // match start from parent
    el .parentElement;
    while (el matchesSelector.(el, selector)) {
    (filter) {
    result.(el);
    } {
    (matchesSelector.(el, filter)) {
    result.(el);
    }
    }
    el .parentElement;
    }
    return result;
    }
  • 1.8 Form

    • Input/Textarea

      // jQuery
      (#my-input).(); // Native
      document.querySelector(#my-input).value;
    • Get index of e.currentTarget between .radio

      // jQuery
      (.currentTarget).index(.radio); // Native
      [].indexOf.(document.querySelectorAll(.radio), .currentTarget);
  • 1.9 Iframe Contents

    jQuery 对象的 iframe contents() 返回的是 iframe 内的 document

    • Iframe contents

      // jQuery
      $iframe.contents(); // Native
      iframe.contentDocument;
    • Iframe Query

      // jQuery
      $iframe.contents().(); // Native
      iframe.contentDocument.querySelectorAll();

⬆ 回到顶部

CSS & Style

  • 2.1 CSS

    • Get style

      // jQuery
      .(color); // Native
      // 注意:此处为了解决当 style 值为 auto 时,返回 auto 的问题
      const .ownerDocument.defaultView;
      // null 的意思是不返回伪类元素
      .getComputedStyle(el, ).color;
    • Set style

      // jQuery
      .({ color #ff0011 }); // Native
      .style.color #ff0011;
    • Get/Set Styles

      注意,如果想一次设置多个 style,可以参考 oui-dom-utils 中 setStyles 方法

    • Add class

      // jQuery
      .addClass(className); // Native
      .classList.(className);
    • Remove class

      // jQuery
      .removeClass(className); // Native
      .classList.remove(className);
    • has class

      // jQuery
      .hasClass(className); // Native
      .classList.contains(className);
    • Toggle class

      // jQuery
      .toggleClass(className); // Native
      .classList.toggle(className);
  • 2.2 Width & Height

    Width 与 Height 获取方法相同,下面以 Height 为例:

    • Window height

      // jQuery
      (window).height(); // Native
      // 不含 scrollbar,与 jQuery 行为一致
      window.document.documentElement.clientHeight;
      // 含 scrollbar
      window.innerHeight;
    • Document height

      // jQuery
      (document).height(); // Native
      document.documentElement.scrollHeight;
    • Element height

      // jQuery
      .height(); // Native
      // 与 jQuery 一致(一直为 content 区域的高度)
      function getHeight() {
      const styles .getComputedStyle(el);
      const height .offsetHeight;
      const borderTopWidth parseFloat(styles.borderTopWidth);
      const borderBottomWidth parseFloat(styles.borderBottomWidth);
      const paddingTop parseFloat(styles.paddingTop);
      const paddingBottom parseFloat(styles.paddingBottom);
      return height borderBottomWidth borderTopWidth paddingTop paddingBottom;
      }
      // 精确到整数(border-box 时为 height 值,content-box 时为 height + padding + border 值)
      .clientHeight;
      // 精确到小数(border-box 时为 height 值,content-box 时为 height + padding + border 值)
      .getBoundingClientRect().height;
    • Iframe height

      $iframe .contents() 方法返回 iframe 的 contentDocument

      // jQuery
      (iframe).contents().height(); // Native
      iframe.contentDocument.documentElement.scrollHeight;
  • 2.3 Position & Offset

    • Position

      // jQuery
      .position(); // Native
      { left .offsetLeft, top .offsetTop }
    • Offset

      // jQuery
      .offset(); // Native
      function getOffset () {
      const .getBoundingClientRect(); return {
      top . window.pageYOffset document.documentElement.clientTop,
      left . window.pageXOffset document.documentElement.clientLeft
      }
      }
  • 2.4 Scroll Top

    // jQuery
    (window).scrollTop(); // Native
    (document.documentElement document.documentElement.scrollTop) document..scrollTop;

⬆ 回到顶部

DOM Manipulation

  • 3.1 Remove

    // jQuery
    .remove(); // Native
    .parentNode.removeChild(el);
  • 3.2 Text

    • Get text

      // jQuery
      .(); // Native
      .textContent;
    • Set text

      // jQuery
      .(string); // Native
      .textContent string;
  • 3.3 HTML

    • Get HTML

      // jQuery
      .(); // Native
      .innerHTML;
    • Set HTML

      // jQuery
      .(htmlString); // Native
      .innerHTML htmlString;
  • 3.4 Append

    Append 插入到子节点的末尾

    // jQuery
    .append(<div id='container'>hello</div>); // Native
    newEl document.createElement();
    newEl.setAttribute(, container);
    newEl.innerHTML hello;
    .appendChild(newEl);
  • 3.5 Prepend

    // jQuery
    .prepend(<div id='container'>hello</div>); // Native
    newEl document.createElement();
    newEl.setAttribute(, container);
    newEl.innerHTML hello;
    .insertBefore(newEl, .firstChild);
  • 3.6 insertBefore

    在选中元素前插入新节点

    // jQuery
    $newEl.insertBefore(queryString); // Native
    const target document.querySelector(queryString);
    target.parentNode.insertBefore(newEl, target);
  • 3.7 insertAfter

    在选中元素后插入新节点

    // jQuery
    $newEl.insertAfter(queryString); // Native
    const target document.querySelector(queryString);
    target.parentNode.insertBefore(newEl, target.nextSibling);

⬆ 回到顶部

用 fetch 和 fetch-jsonp 替代

⬆ 回到顶部

Events

完整地替代命名空间和事件代理,链接到 https://github.com/oneuijs/oui-dom-events

  • 5.1 Bind an event with on

    // jQuery
    .(eventName, eventHandler); // Native
    .addEventListener(eventName, eventHandler);
  • 5.2 Unbind an event with off

    // jQuery
    .(eventName, eventHandler); // Native
    .removeEventListener(eventName, eventHandler);
  • 5.3 Trigger

    // jQuery
    (el).trigger(custom-event, {key1 }); // Native
    (window.CustomEvent) {
    const event CustomEvent(custom-event, {detail {key1 }});
    } {
    const event document.createEvent(CustomEvent);
    event.initCustomEvent(custom-event, , , {key1 });
    } .dispatchEvent(event);

⬆ 回到顶部

Utilities

  • 6.1 isArray

    // jQuery
    .isArray(range); // Native
    Array.isArray(range);
  • 6.2 Trim

    // jQuery
    .(string); // Native
    string.();
  • 6.3 Object Assign

    继承,使用 object.assign polyfill https://github.com/ljharb/object.assign

    // jQuery
    .extend({}, defaultOpts, opts); // Native
    Object.assign({}, defaultOpts, opts);
  • 6.4 Contains

    // jQuery
    .contains(el, child); // Native
    el child .contains(child);

⬆ 回到顶部

Alternatives

Browser Support

Latest ✔ Latest ✔ 10+ ✔ Latest ✔ 6.1+ ✔

License

oneuijs/You-Dont-Need-jQuery的更多相关文章

  1. You Don't Need jQuery

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

  2. 抛弃jQuery,拥抱原生JavaScript

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

  3. 原生JS替代jQuery的各种方法汇总

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

  4. jQuery与原生JS相互转化

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

  5. 你不需要jQuery You Don't Need jQuery

    转载:https://github.com/oneuijs/You-Dont-Need-jQuery/blob/master/README.zh-CN.md You Don't Need jQuery ...

  6. 原生js替换jQuery各种方法-中文版

    原文https://github.com/nefe/You-D... 原生JS与jQuery操作DOM对比 You Don't Need jQuery 前端发展很快,现代浏览器原生 API 已经足够好 ...

  7. You-Dont-Need-JQuery (你不需要JQuery)

    看完这篇文章我才觉得真的要用JQuery ,因为实在是有些地方设计的使用太复杂了, document.querySelector() 和 Document.querySelectorAll 的确是很方 ...

  8. 原生 JavaScript 代替 jQuery【转】

    目录 用原生JavaScript代替jQuery Query Selector CSS & Style DOM Manipulation Ajax Events Utilities Promi ...

  9. 去JQUERY化

    时间 2016-05-17 12:43:59  OurJS 原文  http://ourjs.com/detail/573a9cec88feaf2d031d24fc 主题 jQuery 这是一篇使用原 ...

随机推荐

  1. Vmware扩展磁盘如何不需重启系统

    在虚拟机Vmware中我们有时候需要添加新的虚拟磁盘或给已有虚拟磁盘扩容(expand),在新增磁盘或磁盘扩容后,Linux系统并不能马上识别到.也就是说你看不到磁盘空间变化(使用fdisk -l查看 ...

  2. 聊下 git rebase -i

    在使用git作为源代码管理工具的时候,开发的时经常会面临一个常见的问题,多个commit 需要合并为一个完整的commit提交. 在一个基本的迭代周期里,你会有很多次commit,有跟配置文件相关的, ...

  3. JavaWeb开发环境准备之Linux篇

    01 Linux环境准备 (本文在win10上使用 VMware12 + Ubuntu14.04)   1.JDK安装及相关配置 参考:http://blog.csdn.net/sxdtzhaoxin ...

  4. $.parseJson 在 firefox 下返回 null 的问题

    最近调查一个浏览器兼容性问题,在 IE, chrome下都运行正常,但是在 firefox 下运行时: $.parseJson(xxx) 返回 null,所以导致了 无法正常运行,调查的结果是因为 返 ...

  5. 创建 Image - 每天5分钟玩转 OpenStack(21)

    本节演示如何通过 Web GUI 和 CLI 两种方法创建 Image. OpenStack 为终端用户提供了 Web UI(Horizon)和命令行 CLI 两种交换界面.两种方式我们都要会用. 可 ...

  6. openstack命令备忘录

    原文http://my.oschina.net/u/138210/blog/142661 查看rabbitmq 队列 rabbitmqctl list_queues 查看keystone的用户 key ...

  7. Nodejs以后台服务启动

    1: 从网上查找  LINUX中我们可以使用这种简单的方式让node.js在后台运行: nohup node your_app.js & 经多次实验一直没有成功   2:使用 forever ...

  8. WPF系列 自定控件

    引言 WPF中微软提供了一些基本的控件,但是工作中这些基础的控件往往不能满足我们的需求,这个时候我们就需要根据实际的需求去开发自己的控件,但要注意不是所有功能不满足的情况都需要通过自定义控件来实现.实 ...

  9. es6学习笔记2-解构赋值

    解构赋值基本概论就按照一定的模式通过数组或者对象对一组变量进行赋值的过程. 1.通过数组对变量进行赋值: /*通过这种方式赋值要注意左右两边的结构模式要一样,在赋值的时候,根据位置进行赋值对应模式.* ...

  10. Unity Mono脚本 加密

    加密环境 引擎版本:Unity3D 5.3.4 及更高版本 (使用Mono而并非IL2CPP) 操作系统:CentOS 6.2(Final) 加密环境:Android.IOS(暂定) 加密对象:C#源 ...