一、jQuery 的历史地位

jQuery 由 John Resig 于 2006 年发布。它在那个浏览器兼容性地狱(IE6/7/8 时代)里做了一件改变行业的事:

  • 用统一 API 抹平浏览器差异
  • 链式调用让 DOM 操作变优雅
  • AJAX 一行代码搞定($.ajax
  • 选择器引擎 Sizzle 是 CSS3 选择器规范的事实参考

巅峰时期,全球 80%+ 网站都引了 jQuery,是 Web 开发史上最成功的开源库之一。

现在还需要它吗?新项目不需要。但维护老 PHP/Java 后台、Bootstrap 3/4 模板、WordPress 插件,仍然要会。


二、为什么现在不推荐新项目用

问题说明
DOM API 已经够用querySelectorfetchclassList 原生支持
响应式 UI 是大势React/Vue 数据驱动,jQuery 命令式过时
打包体积30 KB+ 仅为了几个工具函数不划算
大型项目难维护满屏 $(...) 选择器,重构成本高
生态停滞插件更新慢,与现代构建工具集成不友好

但是 —— 小项目、老项目、单页营销页,jQuery 依然轻便好用。


三、核心用法速览

引入

1
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>

DOM 选择 + 操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 选择
$('#id') // ID
$('.class') // class
$('div p:first') // 复合 CSS 选择器
$('input[type=text]') // 属性选择

// 链式调用(jQuery 灵魂)
$('#box')
.addClass('active')
.css('color', 'red')
.text('Hello')
.fadeIn(300);

// 遍历
$('li').each(function (i, el) {
console.log(i, el.textContent);
});

事件

1
2
3
4
5
6
7
8
9
10
11
$('#btn').on('click', function () {
console.log('clicked', this);
});

// 事件委托(动态元素必用)
$('#list').on('click', 'li.item', function () {
console.log('item:', $(this).data('id'));
});

// 解绑
$('#btn').off('click');

AJAX

1
2
3
4
5
6
7
8
9
10
11
12
13
$.ajax({
url: '/api/users',
method: 'POST',
data: { name: 'Mike' },
dataType: 'json',
success: function (res) { console.log(res); },
error: function (xhr) { console.error(xhr.statusText); }
});

// 简写
$.get('/api/users', { id: 1 }, console.log);
$.post('/api/save', { name: 'Mike' });
$.getJSON('/data.json', console.log);

动画

1
2
3
$('#box').slideDown(400);
$('#box').fadeOut(200);
$('#box').animate({ left: '+=100', opacity: 0.5 }, 500);

四、用原生 JS 替代 jQuery(速查表)

jQuery原生 JS
$('#id')document.getElementById('id')
$('.cls')document.querySelectorAll('.cls')
$el.addClass('x')el.classList.add('x')
$el.removeClass('x')el.classList.remove('x')
$el.toggleClass('x')el.classList.toggle('x')
$el.css('color','red')el.style.color = 'red'
$el.html('<b>hi</b>')el.innerHTML = '<b>hi</b>'
$el.text('hi')el.textContent = 'hi'
$el.attr('href')el.getAttribute('href')
$el.on('click', fn)el.addEventListener('click', fn)
$.ajax / $.getfetch(url).then(r => r.json())
$(document).ready(fn)document.addEventListener('DOMContentLoaded', fn)

如果你只用 jQuery 做 DOM 操作 + AJAX,完全可以扔掉


五、踩坑笔记

现象解法
$ 冲突和 Prototype.js 等冲突jQuery.noConflict() 让出 $
Ready 时序操作不到 DOM包在 $(function(){...})DOMContentLoaded
事件没解绑切页后内存泄漏用命名空间 $.on('click.foo') + $.off('.foo') 批量解绑
动态元素无事件后加的 DOM 点击没反应.on('click', '.selector', fn) 委托
异步 this 丢失successthis 不是元素var self = this 或箭头函数(如果 ES6+)
版本兼容jQuery 3 移除了一些 API(.bind/.live/.size升级前看 Migrate Plugin

六、版本选择

系列适用
jQuery 1.x兼容 IE6-8(已停止更新)
jQuery 2.x不支持 IE8-(已停止)
jQuery 3.x当前唯一在维护的版本,IE9+

参考