jQuery 是非常流行的一个 js 的第三方库,它能够帮我们做这些事
jQuery 的目标就是“使用更少的代码做更多的事”。
jQuery 其实只是一个 js 文件,下载后在 中引用即可使用。也可以在线引用 CDN 的 jQuery。
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js">script>
jQuery 是 js 的一个库,所以使用的是 js 语法,另外有些是 js 特有的语法
$(selector).action()
jQuery 选择器允许您对 HTML 元素组或单个元素进行操作。
基于已经存在的 CSS 选择器
// 元素选择器
$('*') // 选择所有元素
$('p') // 选择所有 p 标签
// id 选择器
$("#test") // 选择 id 为 test 的标签
// class 选择器
$(".test") // 选择 class 有 test 的标签
// 属性选择器
$('[type=password]') // 需注意如果属性值包含空格等特殊字符,则需要用双引号括起来
$('[items="A B"]')
// 类选择器和属性选择器可以使用前缀查找或后缀查找
$('[name^=icon]') // 找出所有name属性值以icon开头的DOM
$('[class^="icon-"]') // 找出所有class包含至少一个以`icon-`开头的DOM
$('[name$=with]') // 找出所有name属性值以with结尾的DOM
// 组合查找
$('input[name=email]') // 找到 name=email 的 input 标签
$('tr.red') // 找到 class 有 red 的 tr 标签
// 多项选择器
$('p,div') // 找到所有 p 标签和 div 标签
$('p.red,p.green') // 找到 class=red 或 class=green 的 p 标签
除此之外,它还有一些自定义的选择器
$(this) // 获取当前 HTML 元素
// 选择器中使用 : 冒号进行过滤
$('p:first') // 选择第一个 p 标签
$('ul li:first') // 选择第一个 ul 标签的第一个 li 标签
$('ul li:first-child') // 选择每个 ul 标签的第一个 li 标签
$('ul li:nth-child(2)') // 选择 ul 标签下的第 2 个 li 标签 (从1开始)
$('tr:even') // 选择偶数的 tr 标签
$('tr:odd') // 选择奇数的 tr 标签
除了基本的选择器外,jQuery的层级选择器更加灵活,也更强大。因为DOM的结构就是层级结构,所以我们经常要根据层级关系进行选择
// 如果两个 DOM 元素有层级关系,可以使用层级选择器
$('ul.lang li.lang') // 从class有lang的ul标签查找子节点中class有lang的li标签
// 父子选择器,可以选择有直接父子关系的 DOM 元素
$('ul.lang>li.lang') // 效果同上,只是 ul 标签必须和 li 标签有直接父子关系
// 兄弟选择器,选取平级的 DOM 元素
$('div + p') // 选择每个与 div 标签相邻的下一个 p 标签
$('div ~ p') // 选择与 div 标签 同级的所有 p 标签
针对表单元素,jQuery还有一组特殊的选择器
, , 和 ; ,和 input[type=file] 一样;input[type=checkbox] 一样;input[type=radio] 一样; 上,用 $('input:focus') 就可以选出;$('input[type=radio]:checked') ; 、 等,也就是没有灰掉的输入;:enabled 正好相反,选择那些不能输入的。需要注意的是,jQuery 选择器获取的都是 jQuery 对象。jQuery 对象是一个伪数组,每一个元素都是 DOM 的原生 js 对象。所以 jQuery的选择器不会返回 undefined 或者 null,如果没找到会返回空数组。jQuery对象和DOM对象之间可以互相转化
var div = $('#abc'); // jQuery对象
var divDom = div.get(0); // 假设存在div,获取第1个DOM元素
var another = $(divDom); // 重新把DOM包装为jQuery对象
jQuery 对象的方法可以链式调用,比较方便。
当获取 jQuery 对象后,还可以使用 find() 方法在子节点中进行查找,参数就是选择器的字符串。如果需要查找父级,则可以使用 parent() 方法。对于同一级的节点,可以使用 next() 和 prev() 方法获取临近的后一个或前一个节点。
也可以使用 filter() 方法过滤掉不符合选择器条件的节点,或使用 map() 方法将 jQuery 对象中的各节点映射到一个函数中进行处理(例如转换为 DOM 对象)
此外,如果一个 jQuery 对象包含了不止一个 DOM 节点,可以使用 first()、last() 和 slice() 方法返回一个新的 jQuery 对象。
可以使用带 parent.document 参数的选择器
$('#objID', parent.document);
先获取iframe的document对象,在最外层window中加载的js默认会使用最外层的document对象
let iframeDocument=$("iframe[name='iframeName']")[0].contentWindow.document;
let targetDom=$(iframeDocument).find('子元素');
jQuery 还支持很多选择器,具体的可以查看文档
jQuery 提供一系列与 DOM 相关的方法,这使访问和操作元素和属性变得很容易。
这三个方法可以获取或设置元素的内容(如果方法没有参数是获取,有参数则是将参数(字符串)设置为相应内容),区别为 text() 方法获取的是纯文本(不包含 html 内容),html() 方法获取文本节点内部的所有内容(包含 html 内容,所以也可以用这个方法设置子节点,但是不推荐),value() 方法获取的是元素的 value 属性的内容,常用于表单元素。
attr() 方法的参数有2个,第一个是需要设置或获取的属性名,第二个参数如果没有是获取,如果有则设置到相应的属性。
<input id="test-radio" type="radio" name="test" checked value="1">
<input id="test-radio" type="radio" name="test" checked="checked" value="1">
var radio = $('#test-radio');
radio.attr('checked'); // 'checked'
radio.prop('checked'); // true
prop() 返回值更合理一些。不过,用 is() 方法判断更好
var radio = $('#test-radio');
radio.is(':checked'); // true
需要注意的是,一个jQuery对象可以包含0个或任意个DOM对象,它的方法实际上会作用在对应的每个DOM节点上。所以jQuery对象的另一个好处是我们可以执行一个操作,作用在对应的一组DOM节点上。即使选择器没有返回任何DOM节点,调用jQuery对象的方法仍然不会报错,这意味着jQuery可以免去许多 if 语句。
通过 jQuery,可以很容易地 创建 / 添加 / 删除 新 元素 / 内容。
使用 jQuery 能够很方便的创建一个元素。
var div = $('') // 创建了一个 div 元素,此元素是一个 jQuery 对象,可以设置其属性、内容、子元素等,再添加到合适的位置
var li = $('- '
).text('列表').append( // 可以链式操作
$('').html('这是一个超链接标签').click(() => { // 创建元素时可以附带属性
// 处理点击事件
})
)
- 1
- 2
- 3
- 4
- 5
- 6
添加元素
有四个 jQuery 方法可以添加新元素
- append() - 在被选元素的结尾插入内容
- prepend() - 在被选元素的开头插入内容
- after() - 在被选元素之后插入内容
- before() - 在被选元素之前插入内容
这些方法可以添加通过 text/HTML 、jQuery 或 JS/DOM 创建的元素,将这些元素对象作为参数传入方法即可。
删除元素
如需删除元素和内容,一般可使用以下两个 jQuery 方法:
- remove() - 删除被选元素(及其子元素)
- empty() - 从被选元素中删除子元素
remove() 方法也可接受一个参数,允许对被删元素进行过滤,该参数可以是任何 jQuery 选择器的语法。
CSS 操作
通过 jQuery,可以很容易地对 CSS 元素进行操作。同时因为 jQuery 有批量操作的特定,所以可以批量操作 css,很方便。
CSS 类
- addClass() - 向被选元素添加一个或多个类
- removeClass() - 从被选元素删除一个或多个类
- toggleClass() - 对被选元素进行添加/删除类的切换操作
- css() - 设置或返回样式属性
addClass() 、removeClass() 和 toggleClass() 方法使用时将类名传入参数即可。 toggleClass() 可以判断是否使用了目标类,如果使用了则删除,没使用则添加。
另外可以使用 hasClass() 方法判断是否包含特定 css 类。
css() 方法
css() 方法设置或返回被选元素的一个或多个样式属性。此方法有2个参数,第一个参数是样式属性名,第二个参数如果没有,则返回对应样式属性值,如果有,则设置为该值。
css() 方法其实就是作用于 DOM 节点的 style 属性。
修改节点
jQuery 还提供了多个处理 DOM 尺寸的方法
width() 和 height() :设置或返回元素(不含内外边距和边框)的宽、高innerWidth() 和 innerHeight() : 设置或返回元素(只含内边距)的宽、高outerWidth() 和 outerHeight() : 设置或返回元素(包括外边距在内所有)的宽、高
其他
jQuery 对象有很多方法方便使用。如果拿到的 DOM 对象是 js 对象,则可以转化为 jQuery 对象进行使用。
var div = document.getElementById('div') // 获取一个 js DOM 对象
var div = $(div) // 转化为 jQuery DOM 对象
- 1
- 2
其他更多的 DOM 操作方法和 CSS 方法可以查看文档
事件
事件处理函数
可以使用 on() 和 bind() 方法向元素添加事件处理函数(两种方法等价,不过自 jQuery 1.7 起推荐使用on()方法)。其语法为
$(selector).on(event,childSelector,data,function)
- event : 必需,有效的事件,可以是数组
- childSelector :可选,规定只能添加到指定的子元素上的事件处理程序
- data :可选,规定传递到函数的额外数据
- function :可选,规定当事件发生时运行的函数
$(document).ready(function(){
$("p").on("click",function(){
alert("段落被点击了。");
});
});
- 1
- 2
- 3
- 4
- 5
另外可以使用 off() 方法移除通过 on() 方法添加的事件处理函数。可以使用 one() 方法添加一个或多个处理函数,该处理函数只能被触发一次。
也可以通过事件方法直接绑定事件处理函数,例如
$(document).ready(function(){
$("p").click(function(){
alert("段落被点击了。");
});
});
- 1
- 2
- 3
- 4
- 5
即将事件处理函数以参数形式传入事件方法中。
另外可以反复的绑定事件处理函数,它们会依次执行。
事件方法
常用的 jQuery 事件方法有
-
(
d
o
c
u
m
e
n
t
)
.
r
e
a
d
y
(
f
u
n
c
t
i
o
n
(
)
)
:
文档加载完成后执行的函数,可以简化写为
‘
(document).ready(function(){}) : 文档加载完成后执行的函数,可以简化写为 `
(document).ready(function()):文档加载完成后执行的函数,可以简化写为‘(function(){})
或使用箭头函数$(() => {})`,需注意的是此方法只作用于 document 对象。 - click() : 鼠标点击事件
- mouseenter() : 鼠标穿过事件
- mouseleave() : 鼠标离开事件
- focus() : 获取焦点事件
- blur() : 失去焦点事件
- keypress() : 按键事件
更多的事件方法可以查看文档
调用事件方法
事件的触发总是由用户操作引发的,例如当用户在文本框中输入时,就会触发 change 事件。但是使用 js 改动文本则不会触发 change 事件。这时可以调用不带参数的事件方法来触发该事件。
浏览器安全限制
有些 js 代码只有用户触发才能执行,例如 window.open() 方法
// 无法弹出新窗口,将被浏览器屏蔽:
$(function () {
window.open('/');
});
- 1
- 2
- 3
- 4
这些“敏感代码”只能由用户操作来触发:
var button1 = $('#testPopupButton1');
var button2 = $('#testPopupButton2');
function popupTestWindow() {
window.open('/');
}
button1.click(function () {
popupTestWindow();
});
button2.click(function () {
// 不立刻执行popupTestWindow(),3秒后执行:
setTimeout(popupTestWindow, 3000);
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
当用户点击 button1 时, click 事件被触发,由于 popupTestWindow() 在 click 事件处理函数内执行,这是浏览器允许的,而 button2 的 click 事件并未立刻执行 popupTestWindow() ,延迟执行的 popupTestWindow() 将被浏览器拦截。
事件对象
jQuery 事件调用的处理函数同 js 的事件处理函数,也可以传入一个参数,这个参数就是事件对象。一些关于触发事件的信息就在这个对象里。不过需注意的是,此事件对象是原生的 js 对象,如果使用 jQuery 方法时需要转换为 jQuery 对象。
$('#click').click((evt) => {
// 可以使用 evt.target 获取触发事件的 DOM 对象,注意是 js 对象
// 使用 $(evt.target) 获取 jQuery 对象,即将 js 对象转换为 jQuery 对象
})
- 1
- 2
- 3
- 4
显示效果
jQuery 可以方便的做出滑动、淡入淡出等动画效果
隐藏和显示
使用 hide() 和 show() 方法可以方便的隐藏和显示 HTML 元素
$("p").hide();
$("p").show();
- 1
- 2
但是这两个方法不仅仅只是隐藏和显示。如果给它们加上一个时间,慢慢的隐藏或显示,则出现了动画效果
$("p").hide(1000);
$("p").show(1000);
- 1
- 2
还可以添加回调函数
$(document).ready(function(){
$(".hidebtn").click(function(){
$("div").hide(1000,"linear",function(){
alert("Hide() 方法已完成!");
});
});
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
另外可以使用 toggle() 方法来切换隐藏和显示,用法和 hide() 以及 show() 方法一样。
滑动
通过测试可以发现,hide() 、show() 方法是从左上角逐渐展开或收缩的。如果使用 slideDown() 、slideUp() 和 slideToggle() 方法,则可以上下伸缩,实现滑动效果。其使用方法是一样的。
$("#panel").slideDown();
$("#panel").slideUp();
$("#panel").slideToggle();
- 1
- 2
- 3
淡入淡出
- fadeIn() : 用于淡入已隐藏的元素
- fadeOut() : 用于淡出可见元素
- fadeToggle() : 可以在 fadeIn() 与 fadeOut() 方法之间进行切换
- fadeTo() : 允许渐变为给定的不透明度(值介于 0 与 1 之间)
前三个方法和显示 / 隐藏等方法的使用一样,最后一个 fadeTo() 方法其参数除了能够给定动画时间、回调函数外,还可以指定一个 0 到 1 之间的数值,表示显示的不透明度。
自定义动画
如果觉得这些方法不够,则可以使用 animate() 方法。此方法可以自定义需要的动画效果。
$(selector).animate({params},speed,callback);
- params : 要达到的 CSS 效果,是一个对象类型
- speed : 实现的时间,可以是 fast 或 slow,也可以是毫秒值
- callback : 动画效果结束后的回调函数
$("button").click(function(){
$("div").animate({
left:'250px',
opacity:'0.5',
height:'150px', // 也可以使用相对值,即相对当前值
width:'150px' // width: '+=150px'
});
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
需要注意的是,默认情况下,所有 HTML 元素都有一个静态位置,且无法移动。如需对位置进行操作,要记得首先把元素的 CSS position(定位) 属性设置为 relative(相对)、fixed(固定) 或 absolute(绝对),而不能使用 static(静态)。
队列功能
默认地,jQuery 提供针对动画的队列功能。这意味着如果您在彼此之后编写多个 animate() 调用,jQuery 会创建包含这些方法调用的"内部"队列。然后逐一运行这些 animate 调用。
$("button").click(function(){
var div=$("div");
div.animate({left:'100px'},"slow");
div.animate({fontSize:'3em'},"slow");
});
- 1
- 2
- 3
- 4
- 5
串行(链式)执行
如果队列多了写起来比较麻烦,jQuery的动画效果还可以串行执行,通过 delay() 方法还可以实现暂停,这样,我们可以实现更复杂的动画效果,而代码却相当简单:
var div = $('#test-animates');
// 动画效果:slideDown - 暂停 - 放大 - 暂停 - 缩小
div.slideDown(2000)
.delay(1000)
.animate({
width: '256px',
height: '256px'
}, 2000)
.delay(1000)
.animate({
width: '128px',
height: '128px'
}, 2000);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
并行执行
因为执行动画效果是需要时间的,若干个不同元素同时执行动画效果,就成了并行执行,达到多个动画同时行动的目的。
var div = $('#test-animates');
var otherDiv = $('#test-other');
// 动画效果:slideDown - 暂停 - 放大 - 暂停 - 缩小
div.delay(1000)
.animate({
width: '256px',
height: '256px'
}, 2000)
.delay(1000)
.animate({
width: '128px',
height: '128px'
}, 2000);
otherDiv.delay(500)
.animate({
width: '300px',
height: '300px'
}, 1000)
.delay(500)
.animate({
width: '150px',
height: '150px'
}, 1500);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
另外因为动画需要执行一段时间,所以jQuery必须不断返回新的Promise对象才能后续执行操作。简单地把动画封装在函数中是不够的。
停止动画
可以使用 stop() 方法来停止动画
$(selector).stop(stopAll,goToEnd);
- stopAll : 可选的 stopAll 参数规定是否应该清除动画队列。默认是 false,即仅停止活动的动画,允许任何排入队列的动画向后执行。
- goToEnd : 可选的 goToEnd 参数规定是否立即完成当前动画。默认是 false。
其他
一些其他的动画方法可以参考文档
AJAX
jQuery 能够方便的处理 AJAX 请求,用jQuery的相关对象来处理AJAX,不但不需要考虑浏览器问题,代码也能大大简化。
ajax() 方法
jQuery在全局对象 jQuery (也就是 $ )绑定了 ajax() 函数,可以处理AJAX请求。 ajax(url, settings) 函数需要接收一个URL和一个可选的 settings 对象,常用的选项如下:
- async:是否异步执行AJAX请求,默认为 true ,千万不要指定为 false ;
- method:发送的Method,缺省为 ‘GET’ ,可指定为 ‘POST’ 、 ‘PUT’ 等;
- contentType:发送POST请求的格式,默认值为
'application/x-www-form-urlencoded;charset=UTF-8' ,也可以指定为 text/plain 、 application/json ; - data:发送的数据,可以是字符串、数组或object。如果是GET请求,data将被转换成query附加到URL上,如果是POST请求,根据contentType把data序列化成合适的格式;
- headers:发送的额外的HTTP头,必须是一个object;
- dataType:接收的数据格式,可以指定为 ‘html’ 、 ‘xml’ 、 ‘json’ 、 ‘text’ 等,缺省情况下根据响应的 Content-Type 猜测。
- success : 请求成功后的回调函数
var jqxhr = $.ajax('/api/categories', {
dataType: "json",
method: "GET",
success: (data) => {
// 处理成功的回调函数
},
error: (error) => {
// 处理失败的回调函数
}
});
// 请求已经发送了
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
ajax() 方法返回的对象类似于 Promise 对象,所以可以可以使用链式写法处理回调
var jqxhr = $.ajax('/api/categories', {
dataType: "json",
method: "GET"
}).done(function (data) {
ajaxLog('成功,接收到数据' + JSON.stringify(data));
}).fail(function (xhr, status) {
ajaxLog('失败:' + xhr.status + ',原因:' + status);
}).always(function () {
ajaxLog('请求完成:无论成功与否都会调用');
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
get() 方法
对常用的AJAX操作,jQuery提供了一些辅助方法。由于GET请求最常见,所以jQuery提供了 get() 方法,可以这么写:
var jqxhr = $.get('/path/to/resource', {
name: "Bob Lee",
check: 1
},(response) =>{
// 回调函数,在这里判断成功失败,处理
// response 是返回的响应
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
如果第二参数是对象,实际上 get() 方法会将第二个转为 query string 然后加到URL后面,再发送。
post() 方法
post() 和 get() 类似,但是传入的第二个参数默认被序列化为 application/x-www-formurlencoded :
var jqxhr = $.post('/path/to/resource', {
name: "Bob Lee",
check: 1
},() => {
// 回调函数
});
- 1
- 2
- 3
- 4
- 5
- 6
getJSON() 方法
由于JSON用得越来越普遍,所以jQuery也提供了 getJSON() 方法来快速通过GET获取一个JSON对象:
var jqxhr = $.getJSON('/path/to/resource', {
name: "Bob Lee",
check: 1
}).done(function (data) {
// data已经被解析为JSON对象了
});
- 1
- 2
- 3
- 4
- 5
- 6
其他
关于其他的 ajax 方法,可以查看文档
扩展、插件
可以扩展jQuery来实现自定义方法,这种方式也称为编写jQuery插件。
给jQuery对象绑定一个新方法是通过扩展 $.fn 对象实现的。例如编写一个扩展插件 highlight1(),用来高亮显示 DOM元素
$.fn.highlight2 = function (options) {
// 要考虑到各种情况:
// options为undefined
// options只有部分key
var bgcolor = options && options.backgroundColor || '#fffceb';
var color = options && options.color || '#d85030';
// this已绑定为当前jQuery对象:
this.css('backgroundColor', bgcolor).css('color', color);
return this; // 这样写返回对象本身,可以支持链式操作
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
对于默认值的处理,我们用了一个简单的 && 和 || 短路操作符,总能得到一个有效的值。另一种方法是使用jQuery提供的辅助方法 $.extend(target, obj1, obj2, ...) ,它把多个object对象的属性合并到第一个target对象中,遇到同名属性,总是使用靠后的对象的值,也就是越往后优先级越高。于是可以写成
$.fn.highlight = function (options) {
// 合并默认值和用户设定值:
var opts = $.extend({}, $.fn.highlight.defaults, options);
this.css('backgroundColor', opts.backgroundColor).css('color', opts.color);
return this;
}
// 设定默认值:
$.fn.highlight.defaults = {
color: '#d85030',
backgroundColor: '#fff8de'
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
这时如果使用,只需一次性设定默认值:
$.fn.highlight.defaults.color = '#fff';
$.fn.highlight.defaults.backgroundColor = '#000';
- 1
- 2
就可以非常方便的调用了。总结下
- 给
$.fn 绑定函数,实现插件的代码逻辑; - 插件函数最后要 return this; 以支持链式调用;
- 插件函数要有默认值,绑定在
$.fn..defaults 上; - 用户在调用时可传入设定值以便覆盖默认值。