oneuijs/You-Dont-Need-jQuery

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

时间: 2024-11-03 22:15:43

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

You Don&#39;t Need jQuery

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

抛弃jQuery,拥抱原生JavaScript

前端发展很快,现代浏览器原生 API 已经足够好用.我们并不需要为了操作 DOM.Event 等再学习一下 jQuery 的 API.同时由于 React.Angular.Vue 等框架的流行,直接操作 DOM 不再是好的模式,jQuery 使用场景大大减少.因此我们项目组在双十一后抽了一周时间,把所有代码中的 jQuery 移除.下面总结一下: Why not jQuery 1. 模式变革 jQuery 代表着传统的以 DOM 为中心的开发模式,但现在复杂页面开发流行的是以 React 为代表

基于jquery开发的UI框架整理分析

根据调查得知,现在市场中的UI框架差不多40个左右,不知大家都习惯性的用哪个框架,现在市场中有几款UI框架稍微的成熟一些,也是大家比较喜欢的一种UI框架,那应该是jQuery,有部分UI框架都是根据jQuery研发出来的产品,现在也很常见了. 国产jQuery UI框架 (jUI) DWZ DWZ富客户端框架(jQuery RIA framework), 是中国人自己开发的基于jQuery实现的Ajax RIA开源框架.设计目标是简单实用,快速开发,降低ajax开发成本. jQuery 部件布局

微信生成二维码 只需一个网址即刻 还有jquery生成二维码

<div class="orderDetails-info"> <img src="http://qr.topscan.com/api.php?text=http://123.net/index.php?s=/Home/Index/yanzheng/mai/{$dange.id}" style="width: 5rem; margin-bottom: 1rem;" > </div> http://qr.tops

Jquery基础总结

jquery获取元素索引值index()方法: jquery的index()方法 搜索匹配的元素,并返回相应元素的索引值,从0开始计数. 如果不给 .index() 方法传递参数,那么返回值就是这个jQuery对象集合中第一个元素相对于其同辈元素的位置. 如果参数是一组DOM元素或者jQuery对象,那么返回值就是传递的元素相对于原先集合的位置. 如果参数是一个选择器,那么返回值就是原先元素相对于选择器匹配元素中的位置.如果找不到匹配的元素,则返回-1. <ul> <li id=&quo

初识jQuery

jQuery简介 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是"write Less,Do More",即倡导写更少的代码,做更多的事情.它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作.事件处理.动画设计和Ajax交互. jQuery的核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口:

zepto与jquery冲突的解决

问题出现的背景: 在light7框架下搭建的触屏版项目中,要拓展一个投票系统,其中投票系统有一个比较完善的上传组件,但是此组件是依赖zepto的,而原来的项目是依赖jQuery的,所以就会遇到冲突的问题: 解决方法1: jquery有一个方法叫noConflict() ,可以把jquery的$改掉. var jq=$.noConflict(); 这个时候用jq来代替jquery的$吧. 解决方法2: zepto的符号改掉 window.zp=window.Zepto = Zepto 在zepto

jQuery父级以及同级元素查找的实例

父级以及同级元素的查找在使用过程中还是蛮频繁的,下面为大家介绍下jQuery是如何实现的,感兴趣的朋友可以参考下 jQuery.parent(expr) 找父亲节点,可以传入expr进行过滤,比如$("span").parent()或者$("span").parent(".class") jQuery.parents(expr),类似于jQuery.parents(expr),但是是查找所有祖先元素,不限于父元素 jQuery.children(

jQuery EasyUI---DataGrid

<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>DataGrid</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script src="../jquery-1.4.2.min.js" ty