使用 javascript 替换 jQuery
使用 javascript 替换 jQuery
jQuery 曾风靡一个时代,大大降低了前端开发的门槛,丰富的插件也是前端开发者得心应手的武器库,但是,这个时代终于要落幕了。随着 JS 标准和浏览器的进步,jQuery 的很多精华被原生 JS 吸收,我们直接使用原生 API 就可以用类似手法来处理以前需要 jQuery 的问题。在新的 Web 项目中,如果不需要支持过于陈旧的浏览器版本,那么的确没有必要使用 jQuery。
下面就探讨如何用JavaScript(ES6)标准语法,取代jQuery的一些主要功能。
选取元素
选择器查询
常用的 class、id、属性 选择器都可以使用 document.querySelector 或 document.querySelectorAll 替代。
- document.querySelector 返回第一个匹配的 Element
- document.querySelectorAll 返回所有匹配的 Element 组成的 NodeList。
jQuery:
var $ele = $("selector");
Native:
let ele = document.querySelectorAll("selector");
选择器模式
| 选择器 | 示例 | 示例说明 |
|---|---|---|
| .class | .intro | 选择所有class="intro"的元素 |
| #id | #firstname | 选择所有id="firstname"的元素 |
| * | * | 选择所有元素 |
| element | p | 选择所有<p>元素 |
| element,element | div,p | 选择所有<div>元素和<p>元素 |
| element element | div p | 选择<div>元素内的所有<p>元素 |
| element>element | div>p | 选择所有父级是<div>元素的 <p>元素 |
| element+element | div+p | 选择所有紧接着<div>元素之后的<p>元素 |
| [attribute=value] | a[target=_blank] | 选择所有使用target="_blank"的<a>元素 |
| [attribute^=value] | a[src^="http"] | 选择每一个src属性的值以"http"开头的<a>元素 |
| [attribute$=value] | a[src$=".jpg"] | 选择每一个src属性的值以".jpg"结尾的<a>元素 |
| :first-child | ul li:first-child | 选择<ul>元素下的首个<li>元素 |
| :nth-child(n) | ul li:nth-child(3) | 选择<ul>元素下的第三个<li>元素 |
| :last-child | ul li:last-child | 选择<ul>元素下的最后一个<li>元素 |
DOM 树查询
| jQuery | Native | 方法说明 |
|---|---|---|
$ele.parent() |
ele.parentNode |
元素的直接父元素 |
$ele.children() |
ele.childNodes |
元素的所有直接子元素 |
$ele.find("a") |
ele.querySelectorAll("a") |
元素的后代元素 |
$ele.prev() |
ele.previousElementSibling |
元素的上一个同胞元素 |
$ele.next() |
ele.nextElementSibling |
元素的下一个同胞元素 |
DOM 操作
DOM本身就具有很丰富的操作方法,可以取代jQuery提供的操作方法。
内容和属性
| jQuery | Native | 方法说明 |
|---|---|---|
var text = $ele.text() |
let text = ele.innerText |
获取所选元素的文本内容 |
$ele.text("text") |
ele.innerText = "text" |
设置所选元素的文本内容 |
var html = $ele.html() |
let html = ele.innerHTML |
获取所选元素的HTML内容 |
$ele.html("<div>html</div>") |
ele.innerHTML = "<div>html</div>" |
设置所选元素的HTML内容 |
var input = $ele.val() |
let input = ele.value |
获取表单字段的值 |
$ele.val("input") |
ele.value = "input" |
设置表单字段的值 |
var href = $ele.attr("href") |
let href = ele.getAttribute("href") |
获取元素的属性值 |
$ele.attr("href", "/") |
ele.setAttribute("href", "/") |
设置元素的属性值 |
修改 DOM 树
| jQuery | Native | 方法说明 |
|---|---|---|
$parent.append($ele) |
parent.appendChild(ele) |
在被选元素的结尾插入内容 |
$parent.prepend($ele) |
parent.insertBefore(ele, parent.firstChild) |
在被选元素的开头插入内容 |
$ele.after(html) |
ele.insertAdjacentHTML("afterend", html) |
在被选元素之后插入内容 |
$ele.before(html) |
ele.insertAdjacentHTML("beforebegin", html) |
在被选元素之前插入内容 |
$ele.remove() |
ele.parentNode.removeChild(ele) |
删除被选元素及其子元素 |
$ele.empty() |
ele.innerHTML = null |
从被选元素中删除子元素 |
$ele.clone() |
ele.cloneNode(true) |
拷贝被选元素 |
$ele.replaceWith(html) |
ele.outerHTML = html |
指定HTML替换被选元素 |
CSS 样式
设置 Style
HTML DOM 允许 JavaScript 改变 HTML 元素的样式,Native API 提供了如下几种方式:
- ele.setAttribute 直接修改 DOM style 属性改变样式
- ele.style.cssText 通过 cssText 修改 Style 属性
- ele.style.property 通过 style 对象读写行内 CSS 样式
jQuery:
var size = $ele.css("font-size"); // 返回第一个匹配元素的 CSS 属性值
$ele.css("font-size", "2rem"); // 为所有元素设置指定的 CSS 属性值
Native:
let size = getComputedStyle(ele)["font-size"]; // 获取当前元素计算后的 CSS 属性值
ele.style.setProperty("font-size", "2rem"); // 设置当前元素的某个内联样式
ele.style.removeProperty("font-size"); // 移除当前元素的某个内联样式
设置 Class
| jQuery | Native | 方法说明 |
|---|---|---|
$ele.hasClass(className) |
ele.classList.contains(className) |
检查元素是否包含指定的类名 |
$ele.addClass(className) |
ele.classList.add(className) |
向元素增加一个或多个类名 |
$ele.removeClass(className) |
ele.classList.remove(className) |
从元素中移除一个或多个类 |
$ele.toggleClass(className) |
ele.classList.toggle(className) |
对元素的一个或多个类进行切换 |
事件方法
绑定事件
jQuery:
$ele.on("click", function (evt) {
console.log(evt.target);
});
Native:
ele.addEventListener("click", evt => {
console.log(evt.target);
});
解除绑定
jQuery:
$ele.off("click");
Native:
ele.removeEventListener("click", func);
如果要移除事件,addEventListener 必须使用外部函数,绑定匿名函数的事件是无法移除的。
模拟触发
jQuery:
$ele.trigger("click");
Native:
let event = document.createEvent("MouseEvents");
event.initMouseEvent("click");
ele.dispatchEvent(event);
模拟事件:
- 首先通过 document.createEvent 方法创建 Event 对象。
- 然后利用 Event 对象的 init 方法对其进行初始化。
- 最后使用 dispatchEvent 方法触发 Event 对象。
Ajax
jQuery
$.ajax({
url: "http://apis.juhe.cn/ip/ip2addr",
type: "GET",
data: {
"key": "80701ec21437ca36ca466af27bb8e8d3",
"ip": "220.181.57.216"
},
dataType: "json",
success: function (data) {
console.log(data);
}
});
XHR 封装
window.ajax = async function (params, callback) {
let url = params.url;
let method = params.method;
let data = params.data;
let body = new FormData();
for (let key in data) {
if (data.hasOwnProperty(key)) {
body.append(key, data[key]);
}
}
let xhr = new XMLHttpRequest();
xhr.timeout = 3000;
xhr.open(method, url, true);
xhr.addEventListener("readystatechange", evt => {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
callback(xhr.response);
} else {
throw xhr.statusText;
}
}
});
xhr.send(body);
};
ajax({
url: "http://apis.juhe.cn/ip/ip2addr",
method: "GET",
data: {
"key": "80701ec21437ca36ca466af27bb8e8d3",
"ip": "220.181.57.216"
}
},function (resp) {
var json = JSON.parse(resp);
console.log(json);
}
)
Fetch API
XMLHttpRequest 并不是专为 Ajax 而设计的. 虽然各种框架对 XHR 的封装已经足够好用, 但更好用的 API 是 fetch 。
/* 构造请求对象 */
let request = new Request(
"http://apis.juhe.cn/ip/ip2addr",
{
method: "GET",
body: {
"key": "80701ec21437ca36ca466af27bb8e8d3",
"ip": "220.181.57.216"
},
headers: new Headers()
}
);
/* 处理响应对象 */
fetch(request)
.then(response => response.json())
.then(function (data) {
console.log(data);
})
.catch(function (error) {
console.log(error);
});
详见:fetch用法说明
工具
Array
| jQuery | Native | 方法说明 |
|---|---|---|
$.isArray(array) |
Array.isArray(array) |
判断参数是否为一个数组 |
$.inArray(item, array) |
array.includes(item) |
判断值是否在指定数组中 |
$.makeArray(objlist) |
Array.from(objlist) |
将类数组对象转换为数组 |
$.merge(array1, array2) |
array1.concat(array2) |
合并两个数组(有区别) |
$.each(array, function (i, item) {} |
array.forEach((item, i) => {}) |
遍历指定的对象和数组 |
合并数组时,merge 会改变原数组的内容,而 concat 不会修改原数组,只会返回合并后的数组
Method
| jQuery | Native | 方法说明 |
|---|---|---|
$.now() |
Date.now() |
返回当前时间戳 |
$.trim(context) |
context.trim() |
移除字符串头尾空白 |
$.type(parameter) |
typeof parameter |
检测参数的内部类型 |
$.parseJSON(jsonstr) |
JSON.parse(jsonstr) |
将JSON转换为JS对象 |
$ele.data("key", "value") |
ele.dataset.key = "value" |
在指定的元素上存储数据 |
$.map(array, function (item, i) {}) |
array.map((item, i) => {}) |
将数组转化为处理后的新数组 |
来源:https://segmentfault.com/a/1190000016568472
使用 javascript 替换 jQuery的更多相关文章
- Javascript配合jQuery实现流畅的前端验证
做前端时一般都习惯用JavaScript进行表单的简单验证比如非空验证和正则表达式验证,这样过滤后的数据提交到服务端再由专门的控制器做数据处理,这样能减轻服务器的负担,下面看一下前端验证的简单步骤: ...
- Javascript及Jquery获取元素节点以及添加和删除操作
用了javascript和jquery很久,把所有元素节点的操作总结了下,放在博客上作为记录. Javascript获取元素的主要方式有三种 1.document.getElementById('ma ...
- Web前端学习笔记之JavaScript、jQuery、AJAX、JSON的区别
官网的英文解释: javascript和jQuery有点关系,js是一种脚本语言,主要用于客户端,现在主要用于实现一些网页效果. jquery是js的一个库,你可以认为是对js的补充,提供了很多方便易 ...
- [转载]javascript+ajax+jquery教程11--正则表达式
原文地址:javascript+ajax+jquery教程11--正则表达式作者:morflame 正则表达式可以: 测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个 ...
- 原生js替换jQuery各种方法-中文版
原文https://github.com/nefe/You-D... 原生JS与jQuery操作DOM对比 You Don't Need jQuery 前端发展很快,现代浏览器原生 API 已经足够好 ...
- JavaScript替换字符串中最后一个字符
1.问题背景 在一个输入框中,限制字符串长度为12位.利用键盘输入一个数字,会将字符串中最后一位替换,比方:111111111111.再输入一个3,会显示111111111113 2.详细实现 < ...
- 原生 JavaScript 代替 jQuery【转】
目录 用原生JavaScript代替jQuery Query Selector CSS & Style DOM Manipulation Ajax Events Utilities Promi ...
- JavaScript和Jquery个人笔记
目录 前言 价格 * 数量 = 金额 js计算时间差值 判断敲回车或Shift+回车 js控制textarea换行 $(this)选择当前元素 前端调试禁止其他js js添加a标签href属性和文本 ...
- jQuery学习之路(7)- 用原生JavaScript实现jQuery的某些简单功能
▓▓▓▓▓▓ 大致介绍 学习了妙味,用原生的JavaScript实现jQuery中的某些部分功能 定义自己的函数库lQuery ▓▓▓▓▓▓ $()选择器的实现 jQuery是面向对象的,所以自己编写 ...
随机推荐
- HTML5定位功能,实现在百度地图上定位
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Luogu P2272 [ZJOI2007]最大半连通子图(Tarjan+dp)
P2272 [ZJOI2007]最大半连通子图 题意 题目描述 一个有向图\(G=(V,E)\)称为半连通的\((Semi-Connected)\),如果满足:\(\forall u,v\in V\) ...
- Luogu P4932 浏览器(二进制)
P4932 浏览器 题意 题目背景 __stdcall在用\(Edge\)玩\(slay\)的时候,鼠标会经常失灵,这让她十分痛苦,因此她决定也要让你们感受一下\(Edge\)制造的痛苦. 题目描述 ...
- Luogu P3835 【模板】可持久化平衡树(fhq Treap)
P3835 [模板]可持久化平衡树 题意 题目背景 本题为题目普通平衡树的可持久化加强版. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本 ...
- 03.Hibernate配置文件之核心配置文件
一.核心配置文件的两种配置方式 1.属性文件方式 hibernate.properties(基本不会选用 hibernate.connection.driver_class=com.mysql.jdb ...
- UOJ261 【NOIP2016】天天爱跑步 LCA+动态开点线段树
UOJ261 [NOIP2016]天天爱跑步 Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.天天爱跑步是一个养成类游戏,需要玩家每天按时上线, ...
- vue 基本知识
1,内置事件对象event 原生JS事件中是直接通过传入 e 或者 event 就可以获取,但在vue中要传入 $event 才可以获取到内置事件对象 <body> <button ...
- KOA 学习(九)koa-static
配置静态资源的中间件 const Koa = require('koa'); const app = new Koa(); app.use(require('koa-static')(root, op ...
- Java程序员面试题收集(2)
1 String = 与 new 的不同 使用“=”赋值不一定每次都创建一个新的字符串,而是从“字符串实例池”中查找字符串.使用“new”进行赋值,则每次都创建一个新的字符串. 2 String与S ...
- LINUX使用 su 命令临时切换用户身份
1.su 的适用条件和威力 su命令就是切换用户的工具,怎么理解呢?比如我们以普通用户beinan登录的,但要添加用户任务,执行useradd ,beinan用户没有这个权限,而这个权限恰恰由root ...