# You-Dont-Need-jQuery **Repository Path**: mirrors_fkhadra/You-Dont-Need-jQuery ## Basic Information - **Project Name**: You-Dont-Need-jQuery - **Description**: Examples of how to do query, style, dom, ajax, event etc like jQuery with plain javascript. - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-08 - **Last Updated**: 2026-01-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## You Don't Need jQuery 前端发展很快,现代浏览器原生 API 已经足够好用。我们并不需要为了操作 DOM、Event 等再学习一下 jQuery 的 API。同时由于 React、Angular、Vue 等框架的流行,直接操作 DOM 不再是好的模式,jQuery 使用场景大大减少。本项目总结了大部分 jQuery API 替代的方法,暂时只支持 IE10+ 以上浏览器。 ## 目录 1. [Translations](#translations) 1. [Query Selector](#query-selector) 1. [CSS & Style](#css--style) 1. [DOM Manipulation](#dom-manipulation) 1. [Ajax](#ajax) 1. [Events](#events) 1. [Utilities](#utilities) 1. [Alternatives](#alternatives) 1. [Browser Support](#browser-support) ## Translations * [한국어](./README.ko-KR.md) * [简体中文](./README.zh-CN.md) * [Bahasa Melayu](./README-my.md) * [Bahasa Indonesia](./README-id.md) * [Português(PT-BR)](./README.pt-BR.md) * [Tiếng Việt Nam](./README-vi.md) * [Español](./README-es.md) * [Русский](./README-ru.md) * [Кыргызча](./README-kg.md) * [Türkçe](./README-tr.md) * [Italiano](./README-it.md) * [Français](./README-fr.md) * [日本語](./README-ja.md) ## 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.getElementById`、`document.getElementsByClassName` 或 `document.getElementsByTagName`。 - [1.0](#1.0) Query by selector ```js // jQuery $('selector'); // Native document.querySelectorAll('selector'); ``` - [1.1](#1.1) Query by class ```js // jQuery $('.css'); // Native document.querySelectorAll('.css'); // or document.getElementsByClassName('css'); ``` - [1.2](#1.2) Query by id ```js // jQuery $('#id'); // Native document.querySelector('#id'); // or document.getElementById('id'); ``` - [1.3](#1.3) Query by attribute ```js // jQuery $('a[target=_blank]'); // Native document.querySelectorAll('a[target=_blank]'); ``` - [1.4](#1.4) Find sth. + Find nodes ```js // jQuery $el.find('li'); // Native el.querySelectorAll('li'); ``` + Find body ```js // jQuery $('body'); // Native document.body; ``` + Find Attribute ```js // jQuery $el.attr('foo'); // Native e.getAttribute('foo'); ``` + Find data attribute ```js // jQuery $el.data('foo'); // Native // using getAttribute el.getAttribute('data-foo'); // you can also use `dataset` if only need to support IE 11+ el.dataset['foo']; ``` - [1.5](#1.5) Sibling/Previous/Next Elements + Sibling elements ```js // jQuery $el.siblings(); // Native [].filter.call(el.parentNode.children, function(child) { return child !== el; }); ``` + Previous elements ```js // jQuery $el.prev(); // Native el.previousElementSibling; ``` + Next elements ```js // next $el.next(); el.nextElementSibling; ``` - [1.6](#1.6) Closest Closest 获得匹配选择器的第一个祖先元素,从当前元素开始沿 DOM 树向上。 ```js // jQuery $el.closest(queryString); // Native function closest(el, selector) { const matchesSelector = el.matches || el.webkitMatchesSelector || el.mozMatchesSelector || el.msMatchesSelector; while (el) { if (matchesSelector.call(el, selector)) { return el; } else { el = el.parentElement; } } return null; } ``` - [1.7](#1.7) Parents Until 获取当前每一个匹配元素集的祖先,不包括匹配元素的本身。 ```js // jQuery $el.parentsUntil(selector, filter); // Native function parentsUntil(el, selector, filter) { const result = []; const matchesSelector = el.matches || el.webkitMatchesSelector || el.mozMatchesSelector || el.msMatchesSelector; // match start from parent el = el.parentElement; while (el && !matchesSelector.call(el, selector)) { if (!filter) { result.push(el); } else { if (matchesSelector.call(el, filter)) { result.push(el); } } el = el.parentElement; } return result; } ``` - [1.8](#1.8) Form + Input/Textarea ```js // jQuery $('#my-input').val(); // Native document.querySelector('#my-input').value; ``` + Get index of e.currentTarget between `.radio` ```js // jQuery $(e.currentTarget).index('.radio'); // Native [].indexOf.call(document.querySelectorAll('.radio'), e.currentTarget); ``` - [1.9](#1.9) Iframe Contents jQuery 对象的 iframe `contents()` 返回的是 iframe 内的 `document` + Iframe contents ```js // jQuery $iframe.contents(); // Native iframe.contentDocument; ``` + Iframe Query ```js // jQuery $iframe.contents().find('.css'); // Native iframe.contentDocument.querySelectorAll('.css'); ``` **[⬆ 回到顶部](#目录)** ## CSS & Style - [2.1](#2.1) CSS + Get style ```js // jQuery $el.css("color"); // Native // 注意:此处为了解决当 style 值为 auto 时,返回 auto 的问题 const win = el.ownerDocument.defaultView; // null 的意思是不返回伪类元素 win.getComputedStyle(el, null).color; ``` + Set style ```js // jQuery $el.css({ color: "#ff0011" }); // Native el.style.color = '#ff0011'; ``` + Get/Set Styles 注意,如果想一次设置多个 style,可以参考 oui-dom-utils 中 [setStyles](https://github.com/oneuijs/oui-dom-utils/blob/master/src/index.js#L194) 方法 + Add class ```js // jQuery $el.addClass(className); // Native el.classList.add(className); ``` + Remove class ```js // jQuery $el.removeClass(className); // Native el.classList.remove(className); ``` + has class ```js // jQuery $el.hasClass(className); // Native el.classList.contains(className); ``` + Toggle class ```js // jQuery $el.toggleClass(className); // Native el.classList.toggle(className); ``` - [2.2](#2.2) Width & Height Width 与 Height 获取方法相同,下面以 Height 为例: + Window height ```js // jQuery $(window).height(); // Native // 不含 scrollbar,与 jQuery 行为一致 window.document.documentElement.clientHeight; // 含 scrollbar window.innerHeight; ``` + Document height ```js // jQuery $(document).height(); // Native document.documentElement.scrollHeight; ``` + Element height ```js // jQuery $el.height(); // Native // 与 jQuery 一致(一直为 content 区域的高度) function getHeight(el) { const styles = this.getComputedStyle(el); const height = el.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 - border 值,content-box 时为 height + padding 值) el.clientHeight; // 精确到小数(border-box 时为 height 值,content-box 时为 height + padding + border 值) el.getBoundingClientRect().height; ``` + Iframe height $iframe .contents() 方法返回 iframe 的 contentDocument ```js // jQuery $('iframe').contents().height(); // Native iframe.contentDocument.documentElement.scrollHeight; ``` - [2.3](#2.3) Position & Offset + Position ```js // jQuery $el.position(); // Native { left: el.offsetLeft, top: el.offsetTop } ``` + Offset ```js // jQuery $el.offset(); // Native function getOffset (el) { const box = el.getBoundingClientRect(); return { top: box.top + window.pageYOffset - document.documentElement.clientTop, left: box.left + window.pageXOffset - document.documentElement.clientLeft } } ``` - [2.4](#2.4) Scroll Top ```js // jQuery $(window).scrollTop(); // Native (document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop; ``` **[⬆ 回到顶部](#目录)** ## DOM Manipulation - [3.1](#3.1) Remove ```js // jQuery $el.remove(); // Native el.parentNode.removeChild(el); ``` - [3.2](#3.2) Text + Get text ```js // jQuery $el.text(); // Native el.textContent; ``` + Set text ```js // jQuery $el.text(string); // Native el.textContent = string; ``` - [3.3](#3.3) HTML + Get HTML ```js // jQuery $el.html(); // Native el.innerHTML; ``` + Set HTML ```js // jQuery $el.html(htmlString); // Native el.innerHTML = htmlString; ``` - [3.4](#3.4) Append Append 插入到子节点的末尾 ```js // jQuery $el.append("