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
返回第一个匹配的 Elementdocument.querySelectorAll
返回所有匹配的 Element 组成的 NodeList。它可以通过[].slice.call()
把它转成 Array- 如果匹配不到任何 Element,jQuery 返回空数组
[]
,但document.querySelector
返回null
,注意空指针异常。当找不到时,也可以使用||
设置默认的值,如document.querySelectorAll(selector) || []
注意:
document.querySelector
和document.querySelectorAll
性能很差。如果想提高性能,尽量使用document.getElementById
、document.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[];
- Find nodes
- 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;
- Sibling elements
- 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);
- Input/Textarea
- 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();
- Iframe contents
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);
- Get style
- 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;
- Window height
- 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 } }
- Position
- 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;
- Get text
- 3.3 HTML
- Get HTML
// jQuery .(); // Native .innerHTML;
- Set HTML
// jQuery .(htmlString); // Native .innerHTML htmlString;
- Get HTML
- 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
- 你可能不需要 jQuery (You Might Not Need jQuery) - 如何使用原生 JavaScript 实现通用事件,元素,ajax 等用法。
- npm-dom 以及 webmodules - 在 NPM 上提供独立 DOM 模块的组织
Browser Support
Latest ? | Latest ? | 10+ ? | Latest ? | 6.1+ ? |