使用 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 =&gt; {
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);

模拟事件:

  1. 首先通过 document.createEvent 方法创建 Event 对象。
  2. 然后利用 Event 对象的 init 方法对其进行初始化。
  3. 最后使用 dispatchEvent 方法触发 Event 对象。

详见:JavaScript 事件——“模拟事件”的注意要点

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 =&gt; {
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 =&gt; 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的更多相关文章

  1. Javascript配合jQuery实现流畅的前端验证

    做前端时一般都习惯用JavaScript进行表单的简单验证比如非空验证和正则表达式验证,这样过滤后的数据提交到服务端再由专门的控制器做数据处理,这样能减轻服务器的负担,下面看一下前端验证的简单步骤: ...

  2. Javascript及Jquery获取元素节点以及添加和删除操作

    用了javascript和jquery很久,把所有元素节点的操作总结了下,放在博客上作为记录. Javascript获取元素的主要方式有三种 1.document.getElementById('ma ...

  3. Web前端学习笔记之JavaScript、jQuery、AJAX、JSON的区别

    官网的英文解释: javascript和jQuery有点关系,js是一种脚本语言,主要用于客户端,现在主要用于实现一些网页效果. jquery是js的一个库,你可以认为是对js的补充,提供了很多方便易 ...

  4. [转载]javascript+ajax+jquery教程11--正则表达式

    原文地址:javascript+ajax+jquery教程11--正则表达式作者:morflame 正则表达式可以: 测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个 ...

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

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

  6. JavaScript替换字符串中最后一个字符

    1.问题背景 在一个输入框中,限制字符串长度为12位.利用键盘输入一个数字,会将字符串中最后一位替换,比方:111111111111.再输入一个3,会显示111111111113 2.详细实现 < ...

  7. 原生 JavaScript 代替 jQuery【转】

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

  8. JavaScript和Jquery个人笔记

    目录 前言 价格 * 数量 = 金额 js计算时间差值 判断敲回车或Shift+回车 js控制textarea换行 $(this)选择当前元素 前端调试禁止其他js js添加a标签href属性和文本 ...

  9. jQuery学习之路(7)- 用原生JavaScript实现jQuery的某些简单功能

    ▓▓▓▓▓▓ 大致介绍 学习了妙味,用原生的JavaScript实现jQuery中的某些部分功能 定义自己的函数库lQuery ▓▓▓▓▓▓ $()选择器的实现 jQuery是面向对象的,所以自己编写 ...

随机推荐

  1. vue.js_06_vue.js的自定义指令和自定义键盘修饰符

    1.全局的自定义指令 实现:当页面刷新时,光标聚焦到搜索框中 <label> 搜索: <input type="text" class="form-co ...

  2. Cesium官方教程4--影像图层

    原文地址:https://cesiumjs.org/tutorials/Imagery-Layers-Tutorial/ 影像图层 Cesium支持多种服务来源的高精度影像(地图)数据的加载和渲染.图 ...

  3. qml获取实际渲染的字体

    当设置qml的Text元素的字体时,如果系统中不存在设置的字体,qml会根据匹配算法自动选取系统中存在的一种字体.比如:设置font.family: "微软雅黑",但系统中根本没有 ...

  4. MFC 双缓存绘图

    在SDI应用程序中,当我们需要时刻动态刷新界面的时候,如果我们一直使用,UpdateAllView()那么就会出现屏幕不停闪烁.闪屏非常严重,特别是一直在动态刷新的时候.并且在闪屏的过程中 我们根本就 ...

  5. 微服务开源生态报告 No.10

    「微服务开源生态报告」,汇集各个开源项目近期的社区动态,帮助开发者们更高效的了解到各开源项目的最新进展. 社区动态包括,但不限于:版本发布.人员动态.项目动态和规划.培训和活动. 非常欢迎国内其他微服 ...

  6. MAC中已有的虚拟环境在pycharm 中进行调用

    首先确定虚拟环境的路径: 打开工作环境配置文件,找到工作目录: 在pycharm中解释器中找到工作目录中对应的虚拟环境进行配置就可以了

  7. 前端插件--swiper.js

    使用swiper.js还要注意引入它的同时也要引入swiper.css样式文件: swiper官方文档:http://www.swiper.com.cn/api/effects/193.html 实例 ...

  8. pc端样式重置以及常用样式规范class

    //reset html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a ...

  9. JavaScript中[]+[] 、[]+{}、{}+[]、{}+{}的结果分析

    看到这样一个问题:{} + [] 的结果是多少? 一脸懵逼.. 于是在chrome控制台运行 {} + [] 和用 console.log({} + []) 输出,发现结果不一样.. 于是,把各种可能 ...

  10. JS简单实现:根据奖品权重计算中奖概率实现抽奖的方法

    本文主要介绍:使用 JS 根据奖品权重计算中奖概率实现抽奖的方法. 一.示例场景 1.1.设置抽奖活动的奖项名称 奖项名称:["一等奖", "二等奖", &qu ...