Hi,我是布兰妮甜 !jQuery作为最流行的JavaScript库之一,以其简洁的语法和强大的功能改变了前端开发的方式。本文将全面介绍jQuery的核心知识体系。无论您是刚接触前端开发的新手,还是希望系统掌握jQuery的开发者,本文都将为您提供清晰的学习路径和实践指导。我们将从基础概念讲起,逐步深入jQuery的各个功能模块,并结合实际案例演示其应用场景。
jQuery
的Write Less, Do More
理念使其成为学习前端开发的绝佳起点,理解jQuery不仅能帮助您快速构建交互式网页,更能为学习现代前端框架打下坚实基础。
文章目录
一、jQuery简介
1.1 什么是jQuery
jQuery是一个快速、简洁的JavaScript库,由John Resig于2006年创建。它简化了HTML文档遍历、事件处理、动画和Ajax交互,使Web开发更加高效。jQuery的设计宗旨是"Write Less, Do More"(写得更少,做得更多)。
1.2 jQuery的特点
- 跨浏览器兼容:解决了不同浏览器间的兼容性问题
- 链式操作:允许在一条语句中执行多个操作
- 简洁的API:提供易于理解和使用的函数接口
- 丰富的插件生态:有成千上万的插件可供选择
- 轻量级:压缩后的核心文件只有约30KB
- 开源免费:基于MIT许可证发布
1.3 jQuery的应用场景
- DOM操作与遍历
- 事件处理
- 动画效果
- Ajax交互
- 表单处理
- UI组件开发
二、jQuery核心概念
2.1 $符号
$
是jQuery的别名,是jQuery
函数的简写形式。它是jQuery的核心函数,用于选择元素或创建jQuery对象。
// 以下两种写法等价
$('div')
jQuery('div')
2.2 DOM就绪事件
jQuery提供了$(document).ready()
方法来确保代码在DOM完全加载后执行,这比传统的window.onload
更高效。
$(document).ready(function() {
// DOM完全加载后执行的代码
});
// 简写形式
$(function() {
// DOM完全加载后执行的代码
});
2.3 jQuery对象
当使用jQuery选择元素时,返回的是一个jQuery对象,而不是原生DOM元素。jQuery对象是一个类数组对象,包含零个或多个DOM元素。
var $divs = $('div'); // 返回包含所有div元素的jQuery对象
三、jQuery选择器
3.1 基本选择器
$("#id")
:ID选择器$(".class")
:类选择器$("element")
:元素选择器$("*")
:全选选择器$("selector1, selector2")
:多选选择器
3.2 层次选择器
$("parent > child")
:子元素选择器$("ancestor descendant")
:后代选择器$("prev + next")
:相邻兄弟选择器$("prev ~ siblings")
:一般兄弟选择器
3.3 过滤选择器
基本过滤
:first
、:last
:even
、:odd
:eq(index)
、:gt(index)
、:lt(index)
:header
(选择所有标题元素h1-h6):animated
(选择所有正在执行动画的元素)
内容过滤
:contains(text)
:empty
:has(selector)
:parent
可见性过滤
:visible
:hidden
属性过滤
[attribute]
[attribute=value]
[attribute!=value]
[attribute^=value]
(以…开头)[attribute$=value]
(以…结尾)[attribute*=value]
(包含…)
子元素过滤
:nth-child
:first-child
:last-child
:only-child
表单过滤
:input
:text
:password
:radio
:checkbox
:submit
:image
:reset
:button
:file
:enabled
:disabled
:checked
:selected
3.4 选择器性能优化
-
尽量使用ID选择器(最快)
-
给选择器提供上下文
$('.class', '#container') // 在#container中查找.class
-
缓存jQuery对象
var $elements = $('.elements'); // 多次使用$elements
-
避免过度具体的选择器
-
优先使用find()而不是上下文选择器
四、jQuery DOM操作
4.1 获取和设置内容
.html()
- 获取或设置元素的HTML内容.text()
- 获取或设置元素的文本内容.val()
- 获取或设置表单元素的值
$('#div1').html(); // 获取HTML
$('#div1').html('<p>新内容</p>'); // 设置HTML
$('#input1').val(); // 获取值
$('#input1').val('新值'); // 设置值
4.2 属性操作
.attr()
- 获取或设置属性值.removeAttr()
- 删除属性.prop()
- 获取或设置属性(特别适合布尔属性如checked, disabled等).removeProp()
- 删除属性.addClass()
- 添加类.removeClass()
- 删除类.toggleClass()
- 切换类.hasClass()
- 检查是否有指定类.css()
- 获取或设置样式属性
$('img').attr('src'); // 获取src属性
$('img').attr('src', 'new-image.jpg'); // 设置src属性
$('#div1').addClass('highlight'); // 添加类
$('#div1').css('color', 'red'); // 设置样式
4.3 元素操作
创建元素
var $newDiv = $('<div>', {
id: 'newDiv',
class: 'box',
text: '我是新创建的div',
css: {
color: 'red',
backgroundColor: '#eee'
}
});
插入元素
.append()
- 在内部末尾插入.prepend()
- 在内部开头插入.after()
- 在元素后面插入.before()
- 在元素前面插入.appendTo()
- 将元素追加到指定元素内部末尾.prependTo()
- 将元素前置到指定元素内部开头.insertAfter()
- 将元素插入到指定元素后面.insertBefore()
- 将元素插入到指定元素前面
$('#container').append('<p>新段落</p>');
$('<p>新段落</p>').appendTo('#container');
包裹元素
.wrap()
- 包裹每个匹配的元素.wrapAll()
- 包裹所有匹配的元素.wrapInner()
- 包裹每个匹配元素的内部内容.unwrap()
- 移除元素的父元素
替换元素
.replaceWith()
- 用新内容替换匹配的元素.replaceAll()
- 用匹配的元素替换所有目标元素
删除元素
.remove()
- 删除元素(包括数据和事件).detach()
- 删除元素(保留数据和事件).empty()
- 清空元素内容
克隆元素
-
.clone()
- 创建匹配元素的副本$('#div1').clone().appendTo('#container');
五、jQuery事件处理
5.1 事件绑定
基本事件绑定
.click()
,.dblclick()
.mouseenter()
,.mouseleave()
.mousedown()
,.mouseup()
.mousemove()
.hover()
(相当于mouseenter和mouseleave的组合).focus()
,.blur()
.change()
(表单元素值改变).submit()
(表单提交).keydown()
,.keypress()
,.keyup()
.resize()
(窗口大小改变).scroll()
(滚动事件)
$('#btn1').click(function() {
alert('按钮被点击了!');
});
on()方法(推荐)
jQuery 1.7+推荐使用.on()
方法统一事件绑定:
// 基本用法
$('#btn1').on('click', function() {
console.log('按钮被点击');
});
// 多个事件
$('#btn1').on('click mouseenter', function() {
console.log('按钮被点击或鼠标进入');
});
// 事件委托
$('#container').on('click', '.item', function() {
console.log('子元素被点击');
});
一次性事件
.one()
- 事件只触发一次
5.2 事件解除
-
.off()
- 移除事件处理程序$('#btn1').off(); // 移除所有事件 $('#btn1').off('click'); // 移除所有click事件 $('#btn1').off('click', handler); // 移除特定click事件处理函数
5.3 事件对象
jQuery事件处理函数会接收一个事件对象参数,包含事件相关信息:
$('#btn1').on('click', function(event) {
event.preventDefault(); // 阻止默认行为
event.stopPropagation(); // 阻止事件冒泡
console.log(event.type); // 事件类型
console.log(event.target); // 触发事件的DOM元素
console.log(event.currentTarget); // 绑定事件的DOM元素
console.log(event.pageX, event.pageY); // 鼠标位置
console.log(event.which); // 键盘或鼠标按键
});
5.4 自定义事件
jQuery允许触发和绑定自定义事件:
// 绑定自定义事件
$('#btn1').on('customEvent', function() {
console.log('自定义事件被触发');
});
// 触发自定义事件
$('#btn1').trigger('customEvent');
5.5 事件委托
事件委托利用事件冒泡机制,将事件处理程序绑定到父元素,提高性能:
// 传统方式(低效,特别是对于动态添加的元素)
$('.item').on('click', function() {
console.log('item clicked');
});
// 事件委托方式(高效,适用于动态元素)
$('#container').on('click', '.item', function() {
console.log('item clicked');
});
六、jQuery效果与动画
6.1 基本效果
.show()
- 显示元素.hide()
- 隐藏元素.toggle()
- 切换显示/隐藏状态
$('#box').hide(1000, function() {
console.log('隐藏完成');
});
6.2 淡入淡出
.fadeIn()
- 淡入.fadeOut()
- 淡出.fadeToggle()
- 切换淡入/淡出.fadeTo()
- 渐变到指定透明度
$('#box').fadeIn(500); // 500毫秒淡入
$('#box').fadeTo(500, 0.5); // 渐变到50%透明度
6.3 滑动效果
.slideDown()
- 向下滑动显示.slideUp()
- 向上滑动隐藏.slideToggle()
- 切换滑动效果
6.4 自定义动画
-
.animate()
- 自定义动画$('#box').animate({ left: '+=50px', opacity: 0.5, height: 'toggle' }, 1000, 'swing', function() { console.log('动画完成'); });
参数说明:
- 属性对象(CSS属性和目标值)
- 持续时间(毫秒)
- 缓动函数(‘swing’或’linear’)
- 完成回调函数
6.5 动画控制
.stop()
- 停止当前动画.finish()
- 立即完成所有动画.delay()
- 延迟执行队列中的后续动画
$('#box')
.slideDown(1000)
.delay(500)
.fadeOut(800);
6.6 动画队列
jQuery为每个元素维护一个动画队列(fx队列),可以使用.queue()
和.dequeue()
方法管理:
$('#box')
.animate({left: '100px'}, 1000)
.queue(function(next) {
$(this).css('background', 'red');
next(); // 必须调用next()才能继续队列
})
.animate({top: '100px'}, 800);
七、jQuery Ajax
7.1 核心方法
$.ajax()
jQuery最底层的Ajax实现:
$.ajax({
url: 'api/data',
type: 'GET', // 或 'POST', 'PUT', 'DELETE'等
dataType: 'json', // 预期返回的数据类型
data: {param1: 'value1'}, // 发送到服务器的数据
success: function(response) {
console.log('成功:', response);
},
error: function(xhr, status, error) {
console.log('错误:', error);
},
complete: function() {
console.log('请求完成');
}
});
便捷方法
$.get()
- GET请求$.post()
- POST请求$.getJSON()
- 获取JSON数据$.getScript()
- 获取并执行JavaScript文件
$.get('api/data', {id: 123}, function(response) {
console.log(response);
}, 'json');
$.post('api/save', {name: 'John', age: 30}, function(response) {
console.log('保存成功:', response);
});
7.2 Ajax事件
.ajaxStart()
- Ajax请求开始时触发.ajaxStop()
- Ajax请求结束时触发.ajaxComplete()
- 每个Ajax请求完成时触发.ajaxError()
- Ajax请求失败时触发.ajaxSuccess()
- Ajax请求成功时触发.ajaxSend()
- Ajax请求发送前触发
$(document)
.ajaxStart(function() {
$('#loading').show();
})
.ajaxStop(function() {
$('#loading').hide();
});
7.3 跨域请求(JSONP)
$.ajax({
url: 'http://example.com/api?callback=?',
dataType: 'jsonp',
success: function(response) {
console.log(response);
}
});
7.4 Ajax全局设置
可以通过$.ajaxSetup()
设置全局Ajax默认选项:
$.ajaxSetup({
timeout: 5000,
cache: false,
headers: {
'X-Requested-With': 'XMLHttpRequest'
}
});
八、jQuery工具方法
8.1 实用函数
$.each()
- 遍历数组或对象$.map()
- 通过函数处理数组或对象中的每个元素$.grep()
- 过滤数组$.inArray()
- 查找值在数组中的位置$.merge()
- 合并两个数组$.unique()
- 去除重复DOM元素$.makeArray()
- 将类数组对象转换为真正数组$.extend()
- 合并对象$.trim()
- 去除字符串两端空格
// 遍历数组
$.each([1, 2, 3], function(index, value) {
console.log(index + ': ' + value);
});
// 合并对象
var defaults = {color: 'red', size: 'large'};
var options = {color: 'blue'};
var settings = $.extend({}, defaults, options);
// settings: {color: 'blue', size: 'large'}
8.2 类型检测
$.type()
- 检测对象类型$.isArray()
$.isFunction()
$.isPlainObject()
$.isEmptyObject()
$.isNumeric()
$.isWindow()
$.isXMLDoc()
8.3 延迟对象与Promise
jQuery实现了Promise/A+规范,提供了Deferred对象处理异步操作:
function asyncTask() {
var dfd = $.Deferred();
setTimeout(function() {
if (Math.random() > 0.5) {
dfd.resolve('成功!');
} else {
dfd.reject('失败!');
}
}, 1000);
return dfd.promise();
}
asyncTask()
.done(function(result) {
console.log('成功:', result);
})
.fail(function(error) {
console.log('失败:', error);
})
.always(function() {
console.log('完成');
});
8.4 数据存储
.data()
- 在元素上存储数据.removeData()
- 移除存储的数据
$('#div1').data('key', 'value'); // 存储数据
var value = $('#div1').data('key'); // 获取数据
九、jQuery插件开发
9.1 基本插件模式
(function($) {
$.fn.myPlugin = function(options) {
// 合并默认选项和用户选项
var settings = $.extend({}, $.fn.myPlugin.defaults, options);
// 遍历匹配的元素集合
return this.each(function() {
var $this = $(this);
// 插件逻辑
$this.css('color', settings.color);
// 示例方法
$this.on('click', function() {
alert(settings.message);
});
});
};
// 插件默认选项
$.fn.myPlugin.defaults = {
color: 'red',
message: 'Hello from plugin!'
};
})(jQuery);
// 使用插件
$('.box').myPlugin({
color: 'blue',
message: 'Custom message'
});
9.2 高级插件模式
(function($) {
// 私有方法
function privateMethod() {
console.log('私有方法');
}
// 插件构造函数
function Plugin(element, options) {
this.element = element;
this.$element = $(element);
this.options = options;
this.init();
}
Plugin.prototype = {
init: function() {
// 初始化代码
this.bindEvents();
},
bindEvents: function() {
var self = this;
this.$element.on('click', function() {
self.doSomething();
});
},
doSomething: function() {
// 插件功能
console.log('做点什么', this.options);
},
destroy: function() {
// 清理工作
this.$element.off('click');
}
};
// jQuery插件封装
$.fn.advancedPlugin = function(options) {
var args = arguments;
if (options === undefined || typeof options === 'object') {
// 初始化插件
return this.each(function() {
if (!$.data(this, 'advancedPlugin')) {
$.data(this, 'advancedPlugin',
new Plugin(this, options));
}
});
} else if (typeof options === 'string' && options[0] !== '_') {
// 调用方法
return this.each(function() {
var instance = $.data(this, 'advancedPlugin');
if (instance instanceof Plugin &&
typeof instance[options] === 'function') {
instance[options].apply(instance,
Array.prototype.slice.call(args, 1));
}
});
}
};
})(jQuery);
// 使用插件
$('.element').advancedPlugin({option1: 'value'});
$('.element').advancedPlugin('doSomething');
$('.element').advancedPlugin('destroy');
十、jQuery最佳实践
10.1 性能优化
-
缓存jQuery对象
// 不好 $('#element').hide(); $('#element').show(); // 好 var $element = $('#element'); $element.hide(); $element.show();
-
使用链式操作
$('#element') .css('color', 'red') .addClass('highlight') .animate({left: '100px'}, 500);
-
事件委托(特别是对动态元素)
// 不好(对动态元素无效) $('.item').on('click', function() {}); // 好 $('#container').on('click', '.item', function() {});
-
使用find()代替上下文选择器
// 不好 $('.item', '#container'); // 好 $('#container').find('.item');
-
避免频繁的DOM操作
// 不好 for (var i = 0; i < 100; i++) { $('#container').append('<div>' + i + '</div>'); } // 好 var html = ''; for (var i = 0; i < 100; i++) { html += '<div>' + i + '</div>'; } $('#container').append(html);
10.2 代码组织
-
使用模块模式
var MyModule = (function($) { var privateVar = '私有变量'; function privateMethod() { console.log('私有方法'); } return { publicMethod: function() { privateMethod(); console.log('公有方法'); } }; })(jQuery);
-
使用事件而不是直接调用
// 发布事件 $(document).trigger('customEvent', {data: 'some data'}); // 订阅事件 $(document).on('customEvent', function(event, data) { console.log(data); });
-
分离HTML、CSS和JavaScript
- 避免在JavaScript中硬编码HTML
- 使用CSS类而不是直接样式
- 使用数据属性存储状态
10.3 现代jQuery开发
-
与模块加载器结合(如RequireJS)
define(['jquery'], function($) { // 模块代码 return { init: function() { $('#element').doSomething(); } }; });
-
使用jQuery与现代框架(如React、Vue)
- 通常不建议直接混合使用
- 可以在需要DOM操作时谨慎使用
-
逐步迁移到现代JavaScript
- 使用原生方法替代简单的jQuery功能
- 逐步重构复杂功能
十一、jQuery与现代Web开发
11.1 jQuery与现代JavaScript
随着现代JavaScript的发展,许多jQuery功能已被原生API取代:
jQuery功能 | 原生替代方案 |
---|---|
$(document).ready() | DOMContentLoaded 事件 |
$.ajax() | fetch() API |
$.each() | Array.prototype.forEach() |
$.extend() | Object.assign() |
$(selector) | document.querySelectorAll() |
$(el).css() | el.style 或 window.getComputedStyle() |
$(el).on() | el.addEventListener() |
11.2 何时使用jQuery
仍然适合使用jQuery的场景:
- 需要支持旧版浏览器(IE9及以下)
- 项目已经大量使用jQuery
- 需要快速开发原型
- 需要使用特定的jQuery插件
11.3 jQuery的未来
虽然jQuery的使用率在下降,但它仍然:
- 维护良好(当前版本3.x)
- 被许多网站和CMS(如WordPress)使用
- 是学习JavaScript概念的良好起点
十二、总结
jQuery作为Web开发历史上最重要的库之一,极大地简化了跨浏览器开发,推动了Web技术的发展。虽然现代前端开发逐渐转向框架和原生API,但jQuery的核心思想和许多功能仍然影响着今天的开发实践。
对于初学者,学习jQuery仍然是理解DOM操作、事件处理和Ajax等核心概念的好方法。对于经验丰富的开发者,了解如何将jQuery与现代技术结合或迁移是值得掌握的技能。