jQuery 上手容易,但“会用”和“用得稳”是两回事。
很多坑,刚入门时踩一次就过去了,但有些坑,哪怕写了五六年 jQuery 的老手,依然会在复杂业务里翻车。
本文总结 10 个真实项目中高频出现的 jQuery 坑点,每一个都配有 正确写法 + 错误示例 + 原理解析。建议收藏,排查 Bug 时能救命。
坑点一:$(selector)没找到元素,但不报错
常见写法
$('#submitBtn').on('click', function () {
submitForm();
});
当 #submitBtn 不存在时,代码不会报错,但事件也不会绑定。
在动态渲染、权限控制、异步加载场景下尤为隐蔽。
正确姿势
const $btn = $('#submitBtn');
if ($btn.length) {
$btn.on('click', submitForm);
}
或 事件委托(强烈推荐) :
$(document).on('click', '#submitBtn', submitForm);
记住一句话:jQuery 查不到元素 = 静默失败,不是异常。
坑点二:return false和event.preventDefault()的区别
常见错误
$('a.link').on('click', function () {
doSomething();
return false;
});
正确认知
| 写法 | 阻止默认行为 | 阻止冒泡 |
|---|---|---|
return false |
✅ | ✅ |
event.preventDefault() |
✅ | ❌ |
event.stopPropagation() |
❌ | ✅ |
推荐写法(语义更清晰)
$('a.link').on('click', function (e) {
e.preventDefault();
doSomething();
});
老手建议:除非你明确需要阻止冒泡,否则不要用 return false。
坑点三:动态元素绑定事件,却忘了事件委托
错误示例
$('.item').on('click', function () {
console.log('click');
});
// 后续通过 AJAX 添加的元素
$('.list').append('new');
新元素 不会触发点击事件。
正确写法(事件委托)
$('.list').on('click', '.item', function () {
console.log('click');
});
核心原理:事件绑定在父元素,利用事件冒泡。
坑点四:$.each和$(selector).each()混用
常见混淆
$.each($('.item'), function () {
console.log(this); // DOM 元素
});
正确理解
| 方法 | this 指向 |
|---|---|
$.each(arr, fn) |
数组元素 |
$(sel).each(fn) |
DOM 元素 |
$(sel).each(fn) 内用 $(this)
|
jQuery 对象 |
推荐写法
$('.item').each(function () {
$(this).addClass('active');
});
一句话记忆:$.each 遍历数据,$(sel).each 遍历 DOM。
坑点五:.html()、.text()的 XSS 风险
危险写法
$('#content').html(userInput);
如果 userInput 包含 ,直接执行。
安全写法
$('#content').text(userInput);
或手动转义:
function escapeHtml(str) {
return $('').text(str).html();
}
老手铁律:用户内容一律 .text(),除非你明确信任来源。
坑点六:$(window).load()已废弃
旧代码常见
$(window).load(function () {
// do something
});
在 jQuery 1.8+ 已废弃,3.x 直接报错。
正确写法
$(window).on('load', function () {
// 页面所有资源加载完成
});
// 或 DOM 就绪
$(function () {
// DOM ready
});
区别:
-
DOMContentLoaded:DOM 就绪 -
window.load:图片、iframe 等全部加载完成
坑点七:链式调用中断,却以为是 jQuery Bug
隐蔽错误
$('.item')
.addClass('active')
.css('color', 'red')
.find('.sub')
.end()
.removeClass('active'); // 你可能以为操作的是 .item
正确理解
-
.find()切换了上下文 -
.end()返回上一级 - 链式越长,越容易失控
建议
const $item = $('.item');
$item.addClass('active');
$item.find('.sub').css('color', 'red');
老手经验:超过 3 次的链式调用,考虑拆开写。
坑点八:.prop()和.attr()用错
经典错误
$('#checkbox').attr('checked', true);
在 jQuery 1.6+ 中,表单属性状态要用 .prop() 。
正确用法
| 场景 | 方法 |
|---|---|
| checked / disabled / selected | .prop() |
| 自定义属性 / HTML 属性 | .attr() |
$('#checkbox').prop('checked', true);
$('#box').attr('data-id', 123);
记忆口诀:状态用 prop,属性用 attr。
坑点九:AJAX 缓存导致“数据不更新”
IE / 旧项目常见
$.get('/api/user', function (res) {
console.log(res);
});
IE 会缓存 GET 请求。
解决方案
$.ajax({
url: '/api/user',
type: 'GET',
cache: false
});
或 URL 加时间戳:
$.get('/api/user?_=' + Date.now());
老手建议:所有 GET 请求接口,默认 cache: false。
坑点十:内存泄漏 —— 事件重复绑定
高频坑点(SPA / 弹窗场景)
function initPage() {
$('#btn').on('click', handler);
}
页面多次初始化,事件绑定多次。
正确写法
function initPage() {
$('#btn').off('click').on('click', handler);
}
或事件委托(最优解):
$(document).on('click', '#btn', handler);
老手经验:单页应用里,90% 的“灵异事件”都是重复绑定导致的。
总结:老手也会踩的 10 个坑
| 坑点 | 核心问题 |
|---|---|
| 选择器无结果 | 静默失败 |
| return false | 误用冒泡 |
| 动态元素事件 | 未用委托 |
| each 混淆 | this 指向 |
| html() XSS | 安全问题 |
| window.load | API 废弃 |
| 链式失控 | 上下文混乱 |
| prop / attr | 状态 vs 属性 |
| AJAX 缓存 | 数据不更新 |
| 内存泄漏 | 重复绑定 |
写在最后
jQuery 不是“过时”,而是足够成熟。
在存量系统、后台管理、快速交付场景中,它依然高效。
真正拉开差距的,不是会不会用 $(),而是能不能避开这些“隐形坑”。
到此这篇关于一文盘点10个jQuery项目中高频出现的坑点(老手都在看)的文章就介绍到这了,更多相关jQuery避坑指南内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!











最新评论