一、jQuery介绍
1.什么是jQuery
jQuery是一个轻量级的、兼容多浏览器的JavaScript库。使开发者能够更方便的处理HTML文件、事件、实现动画效果,更方便与Ajax交互,能够极大地简化JavaScript,一句话概括为:让开发者更轻松得写JavaScript代码
2.jQuery的优势
1)jQuery的核心代码不到100k,导入的时候不影响网页的加载速度。库中包含丰富的DOM选择器,比起开发者写原生的JS代码更加方便,平常需要几行代码甚至更多才能解决的问题,导入库之后只需要一两行代码就可以轻松实现
2)支持链式表达式,库中的链式操作可以把多个操作写在一行代码内,是代码更加简洁
3)支持事件、样式、动画,简化了JS操作CSS的代码,代码的可读性比JS更强
4)支持Ajax操作,简化了Ajax操作,后端只需要返回一个JSON格式的字符串就能完成与前端交互
5)兼容性好,几本兼容了所有主流的浏览器,无需考虑太多兼容性问题
6)插件扩展开发,拥有丰富的第三方插件,例如树形菜单、日期控件、图片切换插件、弹出窗口等,网页渲染效果更好,可根据需要进行改写和封装插件
3.jQuery版本
1)1.x版本,兼容IE678,使用最为广泛的,官方只做BUG维护,功能不再新增。因此一般项目来说,使用1.x版本就可以了,最终版本:1.12.4 (2016年5月20日)
2)2.x版本,不兼容IE678,很少有人使用,官方只做BUG维护,功能不再新增。如果不考虑兼容低版本的浏览器可以使用2.x,最终版本:2.2.4 (2016年5月20日)
3)3.x版本,不兼容IE678,只支持最新的浏览器。需要注意的是很多老的jQuery插件不支持3.x版。目前该版本是官方主要更新维护的版本。
4.jQuery对象
jQuery对象就是通过jQuery包装DOM对象后产生的对象,jQuery对象是jQuery独有的,如果一个对象是jQuery,那么它就可以使用jQuery里的方法,但值得注意的是虽然jQuery是包装DOM后产生的,但是jQuery对象无法使用DOM对象的任何方法,反之DOM对象也不可以使用它的方法
通常情况下,约定声明一个jQuery对象的时候在变量前加上符号:$
var $variable = jQuery对像
var variable = DOM对象
$variable[0] //jQuery对象转成DOM对象
$("ul").html(); //jQuery对象可以使用jQuery的方法
$("ul")[0].innerHTML; // DOM对象使用DOM的方法
二、jQuery应用
1.查找标签
1)选择器
id选择器
$("#idname");
标签选择器
$("tagname");
class选择器
$(".classname");
配合使用
$("tagname.classname"); // 找到有某个类的相应标签
所有元素的选择器
$("*");
组合选择器
$("#id, .classname, tagname");
层级选择器
//x和y可以是任意选择器
$("x y"); // x的所有后代y(子子孙孙)
$("x > y"); // x的所有儿子y(儿子)
$("x + y"); // 找到所有紧挨在x后面的y
$("x ~ y"); // x之后所有的兄弟y
基本选择器
:first // 第一个
:last // 最后一个
:eq(index) // 索引等于index的那个元素
:even // 匹配所有索引值为偶数的元素,从 0 开始计数
:odd // 匹配所有索引值为奇数的元素,从 0 开始计数
:gt(index) // 匹配所有大于给定索引值的元素
:lt(index) // 匹配所有小于给定索引值的元素
:not(元素选择器) // 移除所有满足not条件的标签
:has(元素选择器) // 选取所有包含一个或多个标签在其内的标签(指的是从后代元素找)
// 举例
$("div:has(h1)"); // 找到所有后代中有h1标签的div标签
$("div:has(li)"); // 找到所有后代中有li标签的div标签
$("li:not(li)"); // 找到所有不包含li标签的li标签
$("li:not(:has(a))"); // 找到所有后代中不含a标签的li标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>弹框和隐藏功能</title>
<style>
/*隐藏标签*/
.hide {
display: none;
}
/*弹出弹框后改变背景*/
/*.cover {*/
/*position: fixed;*/
/*left: 0;*/
/*right: 0;*/
/*top: 0;*/
/*bottom: 0;*/
/*background-color: wheat;*/
/*z-index: 999;*/
/*}*/
/*弹框的大小、背景*/
.model {
width: 500px;
height: 500px;
background-color: #33cccc;
position: fixed;
left: 50%;
top: 50%;
margin-left: -300px;
margin-top: -200px;
z-index: 1000;
}
</style>
<script src="jQuery/jquery-3.3.1.js"></script>
</head>
<body>
<!--按钮设置-->
<input id="touch" type="button" value="按我弹出弹框">
<!--弹框设置-->
<!--<div class="cover hide"></div>-->
<div class="model hide">
<label for="i1">姓名</label>
<input id="i1" type="text">
<label for="i2">联系方式</label>
<input id="i2" type="text">
<input id="i3" type="button" value="关闭弹框">
</div>
<script>
/*移除隐藏标签的属性,打开弹框*/
var tButton = $("#touch")[0];
tButton.onclick = function(){
// var coverEle = $(".cover")[0];
var modelEle = $(".model")[0];
// $(coverEle).removeClass("hide");
$(modelEle).removeClass("hide");
};
/*加入隐藏标签的属性,关闭弹框*/
var cButton = $("#i3")[0];
cButton.onclick = function(){
// var coverEle = $(".cover")[0];
var modelEle = $(".model")[0];
// $(coverEle).addClass("hide");
$(modelEle).addClass("hide");
}
</script>
</body>
</html>
练习:弹框和隐藏功能
属性选择器
[attribute]
[attribute=value]// 属性等于
[attribute!=value]// 属性不等于
<input type="text">
<input type="password">
<input type="checkbox">
$("input[type='checkbox']"); // 取到checkbox类型的input标签
$("input[type!='text']"); // 取到类型不是text的input标签
练习:属性选择器
表单
// 表单常用筛选
:text
:password
:file
:radio
:checkbox
:submit
:reset
:button
// 表单对象属性
:enabled
:disabled
:checked
:selected
$(":checkbox"); // 找到所有的checkbox
<form>
<input name="email" disabled="disabled" />
<input name="id" />
</form>
$("input:enabled") // 找到可用的input标签
<select id="s1">
<option value="beijing">北京市</option>
<option value="shanghai">上海市</option>
<option selected value="guangzhou">广州市</option>
<option value="shenzhen">深圳市</option>
</select>
$(":selected") // 找到所有被选中的option
表单练习
2)筛选器
下一个元素
$("#id").next()
$("#id").nextAll()
$("#id").nextUntil("#i2")
上一个元素
$("#id").prev()
$("#id").prevAll()
$("#id").prevUntil("#i2")
父亲元素
$("#id").parent()
$("#id").parents() // 查找当前元素的所有的父辈元素
$("#id").parentsUntil() // 查找当前元素的所有的父辈元素,直到遇到匹配的那个元素为止
儿子和兄弟元素
$("#id").children(); // 儿子元素
$("#id").siblings(); // 兄弟元素
查找元素
$("#id").find(); // 搜索所有与指定表达式匹配的元素。这个函数是找出正在处理的元素的后代元素的好方法
获取元素
.first() // 获取匹配的第一个元素
.last() // 获取匹配的最后一个元素
.not() // 从匹配元素的集合中删除与指定表达式匹配的元素
.has() // 保留包含特定后代的元素,去掉那些不含有指定后代的元素
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>左侧菜单</title>
<script src="jquery-3.3.1.min.js"></script>
<style>
.menu {
width: 20%;
height: 100%;
background-color: aqua;
}
.title {
text-align: center;
padding: 10px;
border-bottom: 1px solid white;
}
.items {
background-color: aquamarine;
}
.item {
padding: 5px;
border-bottom: 1px solid white;
}
/*隐藏标签*/
.hide {
display: none;
}
</style>
</head>
<body>
<div class="menu">
<div class="choice">
<div class="title">上海市</div>
<div class="items hide">
<div class="item">浦东新区</div>
<div class="item">黄浦区</div>
<div class="item">静安区</div>
</div>
<div class="title">广州市</div>
<div class="items hide">
<div class="item">天河区</div>
<div class="item">越秀区</div>
<div class="item">海珠区</div>
</div>
<div class="title">深圳市</div>
<div class="items hide">
<div class="item">福田区</div>
<div class="item">南山区</div>
<div class="item">罗湖区</div>
</div>
</div>
</div>
<script>
$(".title").click(function () {
$(".items").addClass("hide");
$(this).next().removeClass("hide");
});
</script>
</body>
</html>
练习:左侧多级菜单
2.操作标签
1)样式操作
样式类
addClass(); // 添加指定的CSS类名
removeClass(); // 移除指定的CSS类名
hasClass(); // 判断样式存不存在
toggleClass(); // 切换CSS类名,如果有就移除,如果没有就添加
$("#b1").removeClass("hide");
$("#b1").addClass("hide");
$("#b1").hasClass("c1");
$("#b1").toggleClass("c1");
CSS
// 语法:css("属性","属性值");
$("#b1").css("color","red");
位置
offset() // 获取匹配元素在当前窗口的相对偏移或设置元素位置-相对文档的当前位置
position() // 获取匹配元素相对父元素的偏移-相对于父级元素
scrollTop() // 获取匹配元素相对滚动条顶部的偏移
scrollLeft() // 获取匹配元素相对滚动条左侧的偏移
尺寸
height()
width()
innerHeight()
innerWidth()
outerHeight()
outerWidth()
练习:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>位置示例-返回顶部</title>
<script src="jquery-3.3.1.min.js"></script>
<style>
.c1 {
width: 200px;
height: 1000px;
background-color: aqua;
}
.hide {
display: none;
}
</style>
</head>
<body>
<button id="b1" class="button1 default">点我偏移</button>
<div class="c1"></div>
<button id="b2" class="button1 default c2 hide">返回顶部</button>
<script>
// $("#b1").on("click", function () {
// $(".c1").offset({left: 200, top:200});
// });
$("#b1").click(function () {
$(".c1").offset({left: 200});
});
// 检测是否翻页了,是则显示返回顶部,否则不显示
$(window).scroll(function () {
if ($(window).scrollTop() > 100) {
$("#b2").removeClass("hide");
}else {
$("#b2").addClass("hide");
}
});
// 返回顶部按钮被按下,返回顶部
$("#b2").click( function () {
$(window).scrollTop(0);
})
</script>
</body>
</html>
练习:迁移与返回顶部示例
2)文本操作
HTML代码
html() // 取得第一个匹配元素的html内容
html(val) // 设置所有匹配元素的html内容
// 查看HTML语句
$("[for='pwd']").html();
// 改变标签内的内容
$("[for='pwd']").html("输入密码");
文本值
text() // 取得所有匹配元素的内容
text(val) // 设置所有匹配元素的内容
值
val() // 取得第一个匹配元素的当前值
val(val) // 设置所有匹配元素的值
val([val1, val2]) // 设置checkbox、select的值
// 获取密码的值
$("#pwd").val();
// 更改密码的值
$("#pwd").val("123123");
练习:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录注册示例</title>
<script src="jquery-3.3.1.min.js"></script>
<style>
.error {
color: red;
}
</style>
</head>
<body>
<form action="">
<p>
<label for="username">用户名</label>
<input type="text" id="username" name="username">
<span class="error"></span>
</p>
<p>
<label for="pwd">密码</label>
<input type="text" id="pwd" name="pwd">
<span class="error"></span>
</p>
<p>
<input type="submit" id="b1" value="登录">
</p>
</form>
<script>
$("#b1").click(function () {
var flag = true;
$("error").text("");
var $username = $("#username");
var $pwd = $("#pwd");
if ($username.val().length === 0) {
$username.next().text("用户名不能为空!");
flag = false;
}
if ($pwd.val().length === 0) {
$pwd.next().text("密码不能为空!");
flag = false;
}
return flag;
})
</script>
</body>
</html>
练习:登录校验示例
3)属性操作
用于ID等自定义属性
attr(attrName) // 返回第一个匹配元素的属性值
attr(attrName, attrValue) // 为所有匹配元素设置一个属性值
attr({k1: v1, k2:v2}) // 为所有匹配元素设置多个属性值
removeAttr() // 从每一个匹配的元素中删除一个属性
用于checkbox和radio
prop() // 获取属性
removeProp() // 移除属性
注意:
在1.x及2.x版本的jQuery中使用attr对checkbox进行赋值操作时会出bug,在3.x版本的jQuery中则没有这个问题。为了兼容性,我们在处理checkbox和radio的时候尽量使用特定的prop(),不要使用attr("checked", "checked")
4)文档处理
添加到指定元素内部的后面
$(A).append(B) // 把B追加到A
$(A).appendTo(B) // 把A追加到B
添加到指定元素内部的前面
$(A).prepend(B) // 把B前置到A
$(A).prependTo(B) // 把A前置到B
添加到指定元素外部的后面
$(A).after(B) // 把B放到A的后面
$(A).insertAfter(B) // 把A放到B的后面
添加到指定元素外部的前面
$(A).before(B) // 把B放到A的前面
$(A).insertBefore(B) // 把A放到B的前面
移除和清空元素
remove() // 从DOM中删除所有匹配的元素
empty() // 删除匹配的元素集合中所有的子节点
替换
replaceWith()
replaceAll()
克隆
clone() // 参数
3.事件
事件绑定
.on( events [, selector ],function(){
...
})
解释:
events 事件
selector 选择器(可选的)
function 事件处理函数
移除事件
.off( events [, selector ][,function(){
...
}])
off() 方法移除用 .on()绑定的事件处理程序
常用事件
click(function(){...})
hover(function(){...})
blur(function(){...})
focus(function(){...})
change(function(){...})
keyup(function(){...})
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>键盘事件示例</title>
<script src="jquery-3.3.1.min.js"></script>
</head>
<body>
<table border="1">
<thead>
<tr>
<th>选项</th>
<th>姓名</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr>
<td><input type="checkbox"></td>
<td>md</td>
<td>
<select>
<option value="1">升职</option>
<option value="2">加薪</option>
<option value="3">滚蛋</option>
</select>
</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>zz</td>
<td>
<select>
<option value="1">升职</option>
<option value="2">加薪</option>
<option value="3">滚蛋</option>
</select>
</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>bo</td>
<td>
<select>
<option value="1">升职</option>
<option value="2">加薪</option>
<option value="3">滚蛋</option>
</select>
</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>jo</td>
<td>
<select>
<option value="1">升职</option>
<option value="2">加薪</option>
<option value="3">滚蛋</option>
</select>
</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>zh</td>
<td>
<select>
<option value="1">升职</option>
<option value="2">加薪</option>
<option value="3">滚蛋</option>
</select>
</td>
</tr>
</tbody>
</table>
<input type="button" id="b1" value="全选">
<input type="button" id="b2" value="取消">
<input type="button" id="b3" value="反选">
<script>
//全选
$("#b1").on("click",function () {
$(":checkbox").prop("checked",true)
});
//取消
$("#b2").on("click",function () {
$(":checkbox").prop("checked",false)
});
//反选
$("#b3").on("click",function () {
$(":checkbox").each(function () {
var flag = $(this).prop("checked");
$(this).prop("checked",!flag);
});
});
//按住shift键批量操作
//定义全局变量
var flag = false;
//全局事件,监听shift键是否被按下
$(window).on("keydown",function (e) {
if (e.keyCode === 16){
flag = true;
}
});
//全局事件,监听shift键是否抬起
$(window).on("keyup",function (e) {
if (e.keyCode === 16){
flag = false;
}
});
//select绑定change事件
$("table select").on("change",function () {
//是否为批量操作
if (flag) {
var selectValue = $(this).val();
//找到所有被选中的哪一行的select,选中指定值
$("input:checked").parent().parent().find("select").val(selectValue);
}
});
</script>
</body>
</html>
练习:keydown和keyup组合示例
阻止后续事件执行
return false; // 常见阻止表单提交等
// 类似于click、keydown等DOM中定义的事件,都可使用.on()方法来绑定事件,但是hover这种jQuery中定义的事件就不能用.on()方法来绑定
// 想使用事件委托的方式绑定hover事件处理函数,可参照如下绑定事件:
$('ul').on('mouseenter', 'li', function() {//绑定鼠标进入事件
$(this).addClass('hover');
});
$('ul').on('mouseleave', 'li', function() {//绑定鼠标划出事件
$(this).removeClass('hover');
});
页面载入
DOM载入就绪可以查询及操纵时绑定一个要执行的函数。这是事件模块中最重要的一个函数,因为它可以极大地提高web应用程序的响应速度
// 方法一
$(document).ready(function(){
// JS代码...
})
// 方法二
$(function(){
// JS代码...
})
事件委托
// 事件委托是通过事件冒泡的原理,利用父标签去捕获子标签的事件
// 示例:表格中每一行的编辑和删除按钮都能触发相应的事件
$("table").on("click", ".delete", function () {
// 删除按钮绑定的事件
})
动画效果
// 基本
show([s,[e],[fn]])
hide([s,[e],[fn]])
toggle([s],[e],[fn])
// 滑动
slideDown([s],[e],[fn])
slideUp([s,[e],[fn]])
slideToggle([s],[e],[fn])
// 淡入淡出
fadeIn([s],[e],[fn])
fadeOut([s],[e],[fn])
fadeTo([[s],o,[e],[fn]])
fadeToggle([s,[e],[fn]])
// 自定义(了解即可)
animate(p,[s],[e],[fn])
each通用迭代函数
jQuery.each(collection, callback(indexInArray, valueOfElement))
用来无缝迭代对象和数组,数组和类似数组的对象通过一个长度属性(如一个函数的参数对象)来迭代数字索引,从0到length - 1,其他对象通过其属性名进行迭代
res =[1,2,3,4]
$.each(res,function(i, v){
console.log(i, v);
}
.each(function(index,Element))
遍历一个jQuery对象,为每个元素执行一个函数
.each()方法用来迭代jQuery对象中的每一个DOM元素,每次回调函数执行时,会传递当前循环次数作为参数(从0开始计数),由于回调函数是在当前DOM元素为上下文的语境中触发的,所以关键字this总是指向这个元素
注意:
在遍历过程中使用return false提前结束each循环
.data()
在匹配的元素集合中的所有元素的上存储任意相关数据或返回匹配的元素几个中的第一个元素的给定名称的数据存储的值
.data(key,value)
// 匹配的元素上存储任意相关数据
// 给所有p标签都保存一个名为k,值为1
$("p").data("k",1);
.data(key)
返回匹配的元素几个中第一个元素的给定名称的数据存储的值,通过.data(name,value)或者HTML5 data-*属性设置
// 返回第一个p标签中保存的"k"的值
$("p").data("k");
.removeDdata(key)
移除存放在元素上的数据,不加key参数表示移除所有保存的数据
// 移除元素上存放k对应的数据
$("p").removeData("k");
了解知识点:
插件