jQuery
jQuery介绍
- jQuery是一个轻量级的、兼容多浏览器的JavaScript库。
- jQuery使用户能够更方便地处理HTML Document、Events、实现动画效果、方便地进行Ajax交互,能够极大地简化JavaScript编程。它的宗旨就是:“Write less, do more.“
jQuery的优势
- 一款轻量级的JS框架。jQuery核心js文件才几十kb,不会影响页面加载速度。
- 丰富的DOM选择器,jQuery的选择器用起来很方便,比如要找到某个DOM对象的相邻元素,JS可能要写好几行代码,而jQuery一行代码就搞定了,再比如要将一个表格的隔行变色,jQuery也是一行代码搞定。
- 链式表达式。jQuery的链式操作可以把多个操作写在一行代码里,更加简洁。
- 事件、样式、动画支持。jQuery还简化了js操作css的代码,并且代码的可读性也比js要强。
- Ajax操作支持。jQuery简化了AJAX操作,后端只需返回一个JSON格式的字符串就能完成与前端的通信。
- 跨浏览器兼容。jQuery基本兼容了现在主流的浏览器,不用再为浏览器的兼容问题而伤透脑筋。
- 插件扩展开发。jQuery有着丰富的第三方的插件,例如:树形菜单、日期控件、图片切换插件、弹出窗口等等基本前端页面上的组件都有对应插件,并且用jQuery插件做出来的效果很炫,并且可以根据自己需要去改写和封装插件,简单实用。
jQuery对象
jQuery对象就是通过jQuery包装DOM对象后产生的对象。jQuery对象是 jQuery独有的。如果一个对象是 jQuery对象,那么它就可以使用jQuery里的方法:例如$(“#i1”).html()。
$("#i1").html()
的意思是:获取id值为 i1
的元素的html代码。其中 html()
是jQuery里的方法。
相当于: document.getElementById("i1").innerHTML;
虽然 jQuery对象
是包装 DOM对象
后产生的,但是 jQuery对象
无法使用 DOM对象
的任何方法,同理 DOM对象
也没不能使用 jQuery
里的方法。
一个约定,我们在声明一个jQuery对象变量的时候在变量名前面加上$:
var $variable = jQuery对像
var variable = DOM对象
$variable[0]//jQuery对象转成DOM对象
拿上面那个例子举例,jQuery对象和DOM对象的使用:
$("#i1").html();//jQuery对象可以使用jQuery的方法
$("#i1")[0].innerHTML;// DOM对象使用DOM的方法
jQuery基础语法
$(selector).action()
查找标签
选择器
id选择器:
$("#id")
标签选择器:
$("tagName")
class选择器:
$(".className")
配合使用:
$("div.c1") // 找到有c1 class类的div标签
所有元素选择器:
$("*")
组合选择器:
$("#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(.c1)")// 找到所有后代中有c1样式类的div标签
$("li:not(.c1)")// 找到所有不包含c1 class的li标签
$("li:not(:has(a))")// 找到所有后代中不含a标签的li标签
注意:
- 这里的
has
和not
不是简单的 有和 没有的意思,它俩没啥关系(不是一组) :not
和:has
通常用.not()
和.has()
代替。$("div:has(.c1)")中的:has(.c1)
等价于$("div .c1"),也就是找后代里面有c1的div标签。
练习:
自定义模态框,使用jQuery实现弹出和隐藏功能。
<!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>
<style>
.cover {
position: fixed;
left: 0;
right: 0;
top: 0;
bottom: 0;
background-color: darkgrey;
z-index: 999;
}
.modal {
width: 600px;
height: 400px;
background-color: white;
position: fixed;
left: 50%;
top: 50%;
margin-left: -300px;
margin-top: -200px;
z-index: 1000;
}
.hide {
display: none;
}
</style>
</head>
<body>
<input type="button" value="弹" id="i0">
<div class="cover hide"></div>
<div class="modal hide">
<label for="i1">姓名</label>
<input id="i1" type="text">
<label for="i2">爱好</label>
<input id="i2" type="text">
<input type="button" id="i3" value="关闭">
</div>
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<script>
var tButton = $("#i0")[0];
tButton.onclick=function () {
var coverEle = $(".cover")[0];
var modalEle = $(".modal")[0];
$(coverEle).removeClass("hide");
$(modalEle).removeClass("hide");
};
var cButton = $("#i3")[0];
cButton.onclick=function () {
var coverEle = $(".cover")[0];
var modalEle = $(".modal")[0];
$(coverEle).addClass("hide");
$(modalEle).addClass("hide");
}
</script>
</body>
</html>
自定义弹出模态框
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义模态框jQuery弹出</title>
<style>
.cover {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: rgba(0,0,0,0.3);
z-index: 999;
}
.modal {
position: fixed;
top: 50%;
left: 50%;
width: 400px;
height: 300px;
margin-top: -150px;
margin-left: -200px;
z-index: 1000;
background-color: white;
}
.hide {
display: none;
}
</style>
</head>
<body>
<input type="button" id="btn" value="点我弹出模态框">
<div class="cover hide"></div>
<div class="modal hide"></div>
<script src="jquery-3.2.1.min.js"></script>
<script>
var btnEle = document.getElementById("btn");
btnEle.onclick=function () {
// $(".cover").removeClass("hide");
// $(".modal").removeClass("hide");
$(".cover, .modal").removeClass("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
例子:
$(":checkbox") // 找到所有的checkbox
表单对象属性:
:enabled
:disabled
:checked
:selected
例子:
<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
筛选器
下一个元素:
$("#id").next()
$("#id").nextAll()
$("#id").nextUntil("#i2")
上一个元素:
$("#id").prev()
$("#id").prevAll()
$("#id").prevUntil("#i2")
父亲元素:
$("#id").parent() $("#id").parents() // 查找当前元素的所有的父辈元素
$("#id").parentsUntil() // 查找当前元素的所有的父辈元素,直到遇到匹配的那个元素为止。
儿子和兄弟元素:
$("#id").children();// 儿子们
$("#id").siblings();// 兄弟们
children和siblings示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>左侧菜单示例</title>
<style>
.left {
position: fixed;
left: 0;
top: 0;
width: 20%;
background-color: darkgrey;
height: 100%;
}
.right {
width: 80%;
}
.title {
text-align: center;
padding: 10px 15px;
border-bottom: 1px solid red;
}
.content {
background-color: #336699;
}
.content > div {
padding: 10px;
color: white;
border-bottom: 1px solid black;
}
.hide {
display: none;
}
</style>
</head>
<body>
<div class="left">
<div class="item">
<div class="title" id="t1">菜单一</div>
<div class="content hide">
<div>111</div>
<div>222</div>
<div>333</div>
</div>
</div>
<div class="item">
<div class="title" id="t2">菜单二</div>
<div class="content hide">
<div>111</div>
<div>222</div>
<div>333</div>
</div>
</div>
<div class="item">
<div class="title" id="t3">菜单三</div>
<div class="content hide">
<div>111</div>
<div>222</div>
<div>333</div>
</div>
</div>
<p>p</p>
</div>
<div class="right"></div>
<script src="jquery-3.2.1.min.js"></script>
<script>
var $titleEles=$(".title");
$titleEles.on("click", function () {
// this指的是当前点击的标签,DOM对象
// console.log(this);
// $(this) --> 把DOM对象转换成jQuery对象
$(this).next().toggleClass("hide").parent().siblings(".item").children(".content").addClass("hide");
})
</script>
</body>
</html>
查找元素:
$("#id").find()// 搜索所有与指定表达式匹配的元素。这个函数是找出正在处理的元素的后代元素的好方法。
补充:
.first()// 获取匹配的第一个元素
.last()// 获取匹配的最后一个元素
.not()// 从匹配元素的集合中删除与指定表达式匹配的元素
.has()// 保留包含特定后代的元素,去掉那些不含有指定后代的元素。
示例:左侧菜单
<!DOCTYPE html>
<html lang="en">
<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>
<style>
.left {
position: fixed;
left: 0;
top: 0;
width: 20%;
height: 100%;
background-color: rgb(47, 53, 61);
}
.right {
width: 80%;
height: 100%;
}
.menu {
color: white;
}
.title {
text-align: center;
padding: 10px 15px;
border-bottom: 1px solid #23282e;
}
.items {
background-color: #181c20;
}
.item {
padding: 5px 10px;
border-bottom: 1px solid #23282e;
}
.hide {
display: none;
}
</style>
</head>
<body>
<div class="left">
<div class="menu">
<div class="title">菜单一</div>
<div class="items">
<div class="item">111</div>
<div class="item">222</div>
<div class="item">333</div>
</div>
<div class="title">菜单二</div>
<div class="items hide">
<div class="item">111</div>
<div class="item">222</div>
<div class="item">333</div>
</div>
<div class="title">菜单三</div>
<div class="items hide">
<div class="item">111</div>
<div class="item">222</div>
<div class="item">333</div>
</div>
</div>
</div>
<div class="right"></div>
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<script>
$(".title").click(function (){ // jQuery绑定事件
// 隐藏所有class里有.items的标签
$(".items").addClass("hide"); //批量操作
$(this).next().removeClass("hide");
});
</script>
操作标签
样式操作
样式类
addClass();// 添加指定的CSS类名。
removeClass();// 移除指定的CSS类名。
hasClass();// 判断样式存不存在
toggleClass();// 切换CSS类名,如果有就移除,如果没有就添加。
示例:开关灯和模态框
CSS
css("color","red")//DOM操作:tag.style.color="red"
示例:
$("p").css("color", "red"); //将所有p标签的字体设置为红色
位置:
offset()// 获取匹配元素在当前窗口的相对偏移或设置元素位置
position()// 获取匹配元素相对父元素的偏移
scrollTop()// 获取匹配元素相对滚动条顶部的偏移
scrollLeft()// 获取匹配元素相对滚动条左侧的偏移
.offset()
方法允许我们检索一个元素相对于文档(document)的当前位置。
和 .position()
的差别在于: .position()
是相对于相对于父级元素的位移。
表格隔行变色示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>表格隔行变色</title>
</head>
<body>
<table border="1">
<thead>
<tr>
<th>#</th>
<th>姓名</th>
<th>爱好</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Egon</td>
<td>街舞</td>
</tr>
<tr>
<td>2</td>
<td>Alex</td>
<td>烫头</td>
</tr>
<tr>
<td>3</td>
<td>Yuan</td>
<td>喝茶</td>
</tr>
<tr>
<td>1</td>
<td>Egon</td>
<td>街舞</td>
</tr>
<tr>
<td>2</td>
<td>Alex</td>
<td>烫头</td>
</tr>
<tr>
<td>3</td>
<td>Yuan</td>
<td>喝茶</td>
</tr>
<tr>
<td>1</td>
<td>Egon</td>
<td>街舞</td>
</tr>
<tr>
<td>2</td>
<td>Alex</td>
<td>烫头</td>
</tr>
<tr>
<td>3</td>
<td>Yuan</td>
<td>喝茶</td>
</tr><tr>
<td>1</td>
<td>Egon</td>
<td>街舞</td>
</tr>
<tr>
<td>2</td>
<td>Alex</td>
<td>烫头</td>
</tr>
<tr>
<td>3</td>
<td>Yuan</td>
<td>喝茶</td>
</tr>
</tbody>
</table>
<script src="jquery-3.2.1.min.js"></script>
<script>
$("tr:odd:not(:has(th))").css("background-color","red");
$("tr:even:not(:has(th))").css("background-color","blue");
</script>
</body>
</html>
示例:
<!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>
<style>
.c1 {
width: 100px;
height: 200px;
background-color: red;
}
.c2 {
height: 50px;
width: 50px;
position: fixed;
bottom: 15px;
right: 15px;
background-color: #2b669a;
}
.hide {
display: none;
}
.c3 {
height: 100px;
}
</style>
</head>
<body>
<button id="b1" class="btn btn-default">点我</button>
<div class="c1"></div>
<div class="c3">1</div>
<div class="c3">2</div>
<div class="c3">3</div>
<div class="c3">4</div>
<div class="c3">5</div>
<div class="c3">6</div>
<div class="c3">7</div>
<div class="c3">8</div>
<div class="c3">9</div>
<div class="c3">10</div>
<div class="c3">11</div>
<div class="c3">12</div>
<div class="c3">13</div>
<div class="c3">14</div>
<div class="c3">15</div>
<div class="c3">16</div>
<div class="c3">17</div>
<div class="c3">18</div>
<div class="c3">19</div>
<div class="c3">20</div>
<div class="c3">21</div>
<div class="c3">22</div>
<div class="c3">23</div>
<div class="c3">24</div>
<div class="c3">25</div>
<div class="c3">26</div>
<div class="c3">27</div>
<div class="c3">28</div>
<div class="c3">29</div>
<div class="c3">30</div>
<div class="c3">31</div>
<div class="c3">32</div>
<div class="c3">33</div>
<div class="c3">34</div>
<div class="c3">35</div>
<div class="c3">36</div>
<div class="c3">37</div>
<div class="c3">38</div>
<div class="c3">39</div>
<div class="c3">40</div>
<div class="c3">41</div>
<div class="c3">42</div>
<div class="c3">43</div>
<div class="c3">44</div>
<div class="c3">45</div>
<div class="c3">46</div>
<div class="c3">47</div>
<div class="c3">48</div>
<div class="c3">49</div>
<div class="c3">50</div>
<div class="c3">51</div>
<div class="c3">52</div>
<div class="c3">53</div>
<div class="c3">54</div>
<div class="c3">55</div>
<div class="c3">56</div>
<div class="c3">57</div>
<div class="c3">58</div>
<div class="c3">59</div>
<div class="c3">60</div>
<div class="c3">61</div>
<div class="c3">62</div>
<div class="c3">63</div>
<div class="c3">64</div>
<div class="c3">65</div>
<div class="c3">66</div>
<div class="c3">67</div>
<div class="c3">68</div>
<div class="c3">69</div>
<div class="c3">70</div>
<div class="c3">71</div>
<div class="c3">72</div>
<div class="c3">73</div>
<div class="c3">74</div>
<div class="c3">75</div>
<div class="c3">76</div>
<div class="c3">77</div>
<div class="c3">78</div>
<div class="c3">79</div>
<div class="c3">80</div>
<div class="c3">81</div>
<div class="c3">82</div>
<div class="c3">83</div>
<div class="c3">84</div>
<div class="c3">85</div>
<div class="c3">86</div>
<div class="c3">87</div>
<div class="c3">88</div>
<div class="c3">89</div>
<div class="c3">90</div>
<div class="c3">91</div>
<div class="c3">92</div>
<div class="c3">93</div>
<div class="c3">94</div>
<div class="c3">95</div>
<div class="c3">96</div>
<div class="c3">97</div>
<div class="c3">98</div>
<div class="c3">99</div>
<div class="c3">100</div>
<button id="b2" class="btn btn-default c2 hide">返回顶部</button>
<script src="jquery-3.2.1.min.js"></script>
<script>
$("#b1").on("click", function () {
$(".c1").offset({left: 200, top:200});
});
$(window).scroll(function () {
if ($(window).scrollTop() > 100) {
$("#b2").removeClass("hide");
}else {
$("#b2").addClass("hide");
}
});
$("#b2").on("click", function () {
$(window).scrollTop(0);
})
</script>
</body>
</html>
尺寸:
height()
width()
innerHeight()
innerWidth()
outerHeight()
outerWidth()
文本操作
HTML代码:
html()// 取得第一个匹配元素的html内容
html(val)// 设置所有匹配元素的html内容
文本值:
text()// 取得所有匹配元素的内容
text(val)// 设置所有匹配元素的内容
值:
val()// 取得第一个匹配元素的当前值
val(val)// 设置所有匹配元素的值
val([val1, val2])// 设置checkbox、select的值
示例:
jQuery赋值演示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>val示例</title>
</head>
<body>
<input type="text" id="i1">
<input type="text" id="i2">
<input type="text" id="i3">
<label for="s1">城市</label>
<select id="s1">
<option value="beijing">北京市</option>
<option value="shanghai">上海市</option>
<option selected value="guangzhou">广州市</option>
<option value="shenzhen">深圳市</option>
</select>
<hr>
<label for="s2">爱好</label>
<select id="s2" multiple="multiple">
<option value="basketball" selected>篮球</option>
<option value="football">足球</option>
<option value="doublecolorball" selected>双色球</option>
</select>
<hr>
此处往上我们使用val()取值和设置值
<p>爱好</p>
<label>
<input type="checkbox" name="hobby" value="basketball"/> 篮球
<input type="checkbox" name="hobby" value="football"/> 足球
<input type="checkbox" name="hobby" value="doublecolorball"/> 双色球
</label>
<p>性别</p>
<label for="radio1">女</label>
<input id="radio1" type="radio" name="gender" value="female"/>
<label for="radio2">男</label>
<input id="radio2" type="radio" name="gender" value="male"/>
<script src="jquery-3.2.1.min.js"></script>
<script>
// 单选下拉框
$("#s1").val("shanghai");
// 多选下拉框
$("#s2").val(["basketball","football"]);
// checkbox
$("input[name='hobby']").val(["basketball","football"]);
// 单选框
$("input[name='gender']").val(["female"]);
</script>
val赋值示例
<script src="jquery-3.2.1.min.js"></script>
</body>
</html>
自定义登录校验
<!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>
<style>
.error {
color: red;
}
</style>
</head>
<body>
<form action="">
<div>
<label for="input-name">用户名</label>
<input type="text" id="input-name" name="name">
<span class="error"></span>
</div>
<div>
<label for="input-password">密码</label>
<input type="password" id="input-password" name="password">
<span class="error"></span>
</div>
<div>
<input type="button" id="btn" value="登录">
</div>
</form>
<script src="jquery-3.2.1.min.js"></script>
<script>
var $inputNameObj = $("#input-name");
$inputNameObj.on("blur", function () {
// 取到name那个input框的值
var username = $inputNameObj.val();
// 判断输入的name长度为不为空
if (username.length === 0) {
// 输入name为空,就显示错误提示信息
$inputNameObj.siblings(".error").text("用户名不能为空");
}
});
$inputNameObj.on("focus", function () {
$(this).next("span").text("");
});
var $inputPasswordObj = $("#input-password");
$inputPasswordObj.on("focus", function () {
$(this).next("span").text("");
});
$inputPasswordObj.on("blur", function () {
var inputPassword = $(this).val();
if (inputPassword.length === 0) {
$(this).next("span").text("密码不能为空");
}
})
</script>
</body>
</html>
属性操作
用于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")。
<input type="checkbox" value="1">
<input type="radio" value="2">
<script>
$(":checkbox[value='1']").prop("checked", true);
$(":radio[value='2']").prop("checked", true);
</script>
示例:全选、反选、取消
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>昨日作业</title>
</head>
<body>
<table border="1">
<thead>
<tr>
<th>#</th>
<th>name</th>
<th>hobby</th>
</tr>
</thead>
<tbody>
<tr>
<td><input type="checkbox"></td>
<td>Egon</td>
<td>街舞</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Alex</td>
<td>烫头</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>李岩</td>
<td>喝热水</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>晓梅</td>
<td>烧热水</td>
</tr>
</tbody>
</table>
<input id="b1" value="全选" type="button">
<input id="b2" value="反选" type="button">
<button id="b3">取消</button>
<script src="jquery-3.2.1.min.js"></script>
<script>
$("#b1").on("click", function () {
// 找到所有的checbox,让他们选中
$(":checkbox").prop("checked", true);
});
$("#b3").on("click", function () {
// 找到所有的checbox,让他们选中
$(":checkbox").prop("checked", false);
});
$("#b2").on("click", function () {
// 对jQuery对象调用each()方法
$(":checkbox").each(function () {
var flag = $(this).prop("checked");
$(this).prop("checked", !flag);
})
})
</script>
</body>
</html>
each循环示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>each循环</title>
</head>
<body>
<script src="jquery-3.2.1.min.js"></script>
<script>
var a = [11, 22, 33, 44, 55];
$.each(a, function (i,v) {
console.log(i, v);
if (v === 33){
return false;
}
})
</script>
</body>
</html>
return false示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>return false</title>
</head>
<body>
<form action="">
<input id="name" type="text">
<input id="pwd" type="password">
<input type="submit" value="提交">
</form>
<script src="jquery-3.2.1.min.js"></script>
<script>
$(":submit").on("click", function () {
if ($("#name").val().length === 0 || $("#pwd").val().length === 0) {
return false;
}
})
</script>
</body>
</html>
文档处理
添加到指定元素内部的后面
$(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()// 删除匹配的元素集合中所有的子节点。
文档操作
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文档操作</title>
<style>
#d1 {
background-color: red;
}
</style>
</head>
<body>
<ul id="u1">
<li>1</li>
</ul>
<p id="p1">p1</p>
<div id="d1">
<div>
<span>1</span><span>2</span>
</div>
</div>
<script src="jquery-3.2.1.min.js"></script>
<script>
var liEle = document.createElement("li");
// 往后插
// $(liEle).text("2");
// $("ul").append(liEle);
// $(liEle).appendTo($("ul"));
// 往前插
$(liEle).text("0");
// $("ul").prepend(liEle);
$(liEle).prependTo($("#u1"));
// 外部插入,后面
var pEle = document.createElement("p");
// 往后插 (同级)
// $(pEle).text("p2");
// $("#p1").after(pEle);
// 往前插(同级)
$(pEle).text("p0");
// $("#p1").before(pEle);
$(pEle).insertBefore($("#p1"));
</script>
</body>
</html>
文档操作示例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>文档操作示例</title> </head> <body> <button id="b1">新增</button> <table border="1" id="t1"> <thead> <tr> <th>#</th> <th>姓名</th> <th>爱好</th> <th>操作</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>Egon</td> <td>杠娘</td> <td> <input type="button" value="编辑"> <input class="delete" type="button" value="删除"> </td> </tr> <tr> <td>2</td> <td>Alex</td> <td>吹牛逼</td> <td> <input type="button" value="编辑"> <input class="delete" type="button" value="删除"> </td> </tr> <tr> <td>3</td> <td>Yuan</td> <td>日天</td> <td> <input type="button" value="编辑"> <input class="delete" type="button" value="删除"> </td> </tr> </tbody> </table> <script src="jquery-3.2.1.min.js"></script> <script> $("#b1").on("click", function () { // 新增一条数据 var trEle = document.createElement("tr"); $(trEle).html("<td>4</td> <td>Gold</td> <td>开车</td> <td> <input type='button' value='编辑'> <input class='delete' type='button' value='删除'> </td>") // $("tbody").append(trEle); }); // 普通绑定事件的方式 // $(".delete").on("click", function () { // // this 当前点击的标签 // // 删除当前行 // $(this).parent().parent().remove(); // }); // 事件委托的方式 $("tbody").on("click", ".delete", function () { // this 当前点击的标签 // 删除当前行 $(this).parent().parent().remove(); }) </script> </body> </html>
替换
replaceWith()
replaceAll()
替换示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>替换示例</title>
</head>
<body>
<div>div1</div>
<div>div2</div>
<script src="jquery-3.2.1.min.js"></script>
<script>
var pEle = document.createElement("p");
$(pEle).text("p标签");
// $("div").replaceWith(pEle);
$(pEle).replaceAll($("div"));
</script>
</body>
</html>
克隆
clone()// 参数
克隆示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>克隆示例</title>
<style>
.c1 {
background-color: deeppink;
padding: 10px;
color: white;
margin: 5px;
border: none;
}
.c2 {
background-color: dodgerblue;
padding: 10px;
color: white;
margin: 5px;
border: none;
}
</style>
</head>
<body>
<button class="c1">屠龙宝刀,点击就送!</button>
<hr>
<button class="c2">屠龙宝刀,点击就送!</button>
<script src="jquery-3.2.1.min.js"></script>
<script>
$(".c1").on("click", function () {
$(this).clone().insertAfter(this);
});
$(".c2").on("click", function () {
$(this).clone(true).insertAfter(this);
})
</script>
</body>
</html>
事件
常用事件
click(function(){...})
hover(function(){...})
blur(function(){...})
focus(function(){...})
change(function(){...})
keyup(function(){...})
keydown和keyup事件组合示例:
<!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>
</head>
<body>
<table border="1">
<thead>
<tr>
<th>#</th>
<th>姓名</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr>
<td><input type="checkbox"></td>
<td>Egon</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>Alex</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>Yuan</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>EvaJ</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>Gold</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 src="jquery-3.2.1.min.js"></script>
<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键,批量操作
// 找到选中的
// $(":checked")
var flag = false;
// 1. 搞清楚事件由什么触发 --> select的change触发
// 2. 根据按没按shift键 做不同的处理
// 3. 如何判断shift有没有被按下
// 4. 利用标志位
$(window).on("keydown", function () {
if (event.keyCode===16){
// 将标志位置为true
flag=true;
}
});
// 当shift按键被抬起来的时候,将flag置为false
$(window).on("keyup", function () {
if (event.keyCode===16){
// 将标志位置为false
flag=false;
}
});
$("select").on("change", function () {
// 如果你的shift按键被按下,我就执行批量修改的操作
// 判断是否被选中
var isChecked = $(this).parent().parent().find("input:checkbox").prop("checked");
if (flag && isChecked) {
// 就执行批量操作
// 1. 取到当前select选中的那个值
// console.log(this);
// console.log($(this).val());
var optionValue = $(this).val();
// 2. 把所有选中的checkbox那一行的select设置为指定的值
// console.log($("input:checked").parent());
// console.log($("input:checked").parent().parent().find("select"));
$("input:checked").parent().parent().find("select").val(optionValue);
}
})
</script>
</body>
</html>
事件绑定
.on( events [, selector ],function(){})
- events: 事件
- selector: 选择器(可选的)
- function: 事件处理函数
移除事件
.off( events [, selector ][,function(){}])
off()
方法移除用[ .on()
绑定的事件处理程序。
- events: 事件
- selector: 选择器(可选的)
- function: 事件处理函数
阻止后续事件执行
return false; // 常见阻止表单提交等
页面载入
当DOM载入就绪可以查询及操纵时绑定一个要执行的函数。这是事件模块中最重要的一个函数,因为它可以极大地提高web应用程序的响应速度。
两种写法:
$(document).ready(function(){
// 在这里写你的JS代码...
})
简写:
$(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>
<style>
.error {
color: red;
}
</style>
</head>
<body>
<form id="myForm">
<label for="name">姓名</label>
<input type="text" id="name">
<span class="error"></span>
<label for="passwd">密码</label>
<input type="password" id="passwd">
<span class="error"></span>
<input type="submit" id="modal-submit" value="登录">
</form>
<script src="jquery-3.2.1.min.js"></script>
<script src="s7validate.js"></script>
<script>
function myValidation() {
// 多次用到的jQuery对象存储到一个变量,避免重复查询文档树
var $myForm = $("#myForm");
$myForm.find(":submit").on("click", function () {
// 定义一个标志位,记录表单填写是否正常
var flag = true;
$myForm.find(":text, :password").each(function () {
var val = $(this).val();
if (val.length <= 0 ){
var labelName = $(this).prev("label").text();
$(this).next("span").text(labelName + "不能为空");
flag = false;
}
});
// 表单填写有误就会返回false,阻止submit按钮默认的提交表单事件
return flag;
});
// input输入框获取焦点后移除之前的错误提示信息
$myForm.find("input[type!='submit']").on("focus", function () {
$(this).next(".error").text("");
})
}
// 文档树就绪后执行
$(document).ready(function () {
myValidation();
});
</script>
</body>
</html>
事件委托
事件委托是通过事件冒泡的原理,利用父标签去触发子标签的事件。
示例:
表格中每一行的编辑和删除按钮都能触发相应的事件。
$("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])
动画效果示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>动画效果示例</title>
</head>
<body>
<img style="position: relative" id="i1" width="300" src="http://www.iyi8.com/uploadfile/2015/1024/20151024114500805.jpg" alt="我前女友">
<button id="b1">再见</button>
<button id="b2">再见x2</button>
<button id="b3">往左</button>
<button id="b4">往右</button>
<script src="jquery-3.2.1.min.js"></script>
<script>
$("#b1").on("click", function () {
$("#i1").toggle(3000);
});
$("#b2").on("click", function () {
$("#i1").fadeToggle(3000);
});
$("#b3").on("click", function () {
$("#i1").animate({
"right": "+50px"
}, 3000)
});
$("#b4").on("click", function () {
$("#i1").animate({
"right": "-50px"
}, 3000)
})
</script>
</body>
</html>
自定义动画示例:
<!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>
<style>
div {
position: relative;
display: inline-block;
}
div>i {
display: inline-block;
color: red;
position: absolute;
right: -16px;
top: -5px;
opacity: 1;
}
</style>
</head>
<body>
<div id="d1">点赞</div>
<script src="jquery-3.2.1.min.js"></script>
<script>
$("#d1").on("click", function () {
var newI = document.createElement("i");
newI.innerText = "+1";
$(this).append(newI);
$(this).children("i").animate({
opacity: 0
}, 1000)
})
</script>
</body>
</html>
自定义动画示例2
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义动画</title>
<style>
.c1 {
width: 50px;
height: 50px;
background-color: red;
}
</style>
</head>
<body>
<div class="c1"></div>
<button id="b1">变粗</button>
<script src="jquery-3.2.1.min.js"></script>
<script>
$("#b1").on("click", function () {
$(".c1").animate({
"width": "+=50px"
}, 2000)
})
</script>
</body>
</html>
jQuery事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jQuery事件</title>
</head>
<body>
<button id="b1">点我</button>
<select name="" id="s1">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<script src="jquery-3.2.1.min.js"></script>
<script>
// $("#b1").click(function () {
// alert(123);
// });
// $("#b1").on("click", function () {
// alert(456);
// });
// 鼠标移上去触发事件
$("#b1").hover(function () {
alert(789);
});
// change
$("#s1").change(function () {
alert("大王小王");
});
// 按键事件
// keydown 按下
// keyup 抬起
// keypress 按一下
$(window).keydown(function () {
alert(event.keyCode);
})
</script>
</body>
</html>
补充
each
jQuery.each(collection, callback(indexInArray, valueOfElement)):
描述:一个通用的迭代函数,它可以用来无缝迭代对象和数组。数组和类似数组的对象通过一个长度属性(如一个函数的参数对象)来迭代数字索引,从0到length - 1。其他对象通过其属性名进行迭代。
li =[10,20,30,40]
$.each(li,function(i, v){
console.log(i, v);//index是索引,ele是每次循环的具体元素。
})
输出:
010
120
230
340
.each(function(index, Element)):
描述:遍历一个jQuery对象,为每个匹配元素执行一个函数。
.each()
方法用来迭代jQuery对象中的每一个DOM元素。每次回调函数执行时,会传递当前循环次数作为参数(从0开始计数)。由于回调函数是在当前DOM元素为上下文的语境中触发的,所以关键字 this
总是指向这个元素。
// 为每一个li标签添加foo
$("li").each(function(){
$(this).addClass("c1");
});
注意: jQuery的方法返回一个jQuery对象,遍历jQuery集合中的元素 - 被称为隐式迭代的过程。当这种情况发生时,它通常不需要显式地循环的 .each()
方法:
也就是说,上面的例子没有必要使用each()方法,直接像下面这样写就可以了:
$("li").addClass("c1"); // 对所有标签做统一操作
注意:
在遍历过程中可以使用 return false
提前结束each循环。
终止each循环
return false;
伏笔...
.data()
在匹配元素上存储任意相关数据或返回匹配的元素集合中的第一个元素的给定名称的数据存储的值。
.data(key, value):
描述:在匹配的元素上存储任意相关数据。
$("div").data("k",100);//给所有div标签都保存一个名为k,值为100
.data(key):
描述: 返回匹配的元素集合中的第一个元素的给定名称的数据存储的值—通过 .data(name, value)
或 HTML5 data-*
属性设置。
$("div").data("k");//返回第一个div标签中保存的"k"的值
示例:
模态框编辑的数据回填表格
插件
jQuery.extend(object)
jQuery的命名空间下添加新的功能。多用于插件开发者向 jQuery 中添加新函数时使用。
示例:
<script>
jQuery.extend({
min:function(a, b){return a < b ? a : b;},
max:function(a, b){return a > b ? a : b;}
});
jQuery.min(2,3);// => 2
jQuery.max(4,5);// => 5
</script>
jQuery.fn.extend(object)
一个对象的内容合并到jQuery的原型,以提供新的jQuery实例方法。
<script>
jQuery.fn.extend({
check:function(){
returnthis.each(function(){this.checked =true;});
},
uncheck:function(){
returnthis.each(function(){this.checked =false;});
}
});
// jQuery对象可以使用新添加的check()方法了。
$("input[type='checkbox']").check();
</script>
单独写在文件中的扩展:
(function(jq){
jq.extend({
funcName:function(){
...
},
});
})(jQuery);
jQuery扩展示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jQuery扩展</title>
</head>
<body>
<script src="jquery-3.2.1.min.js"></script>
<script src="扩展1.js"></script>
<!--(function () {-->
<!--function f() {-->
<!--console.log("我是来自扩展1里面的f");-->
<!--}-->
<!--$.extend({-->
<!--xiaomei: function () {-->
<!--f();-->
<!--}-->
<!--});-->
<!--})();-->
<script src="扩展2.js"></script>
<!--(function(jq) {-->
<!--function f() {-->
<!--console.log("我是来自扩展2里面的f");-->
<!--}-->
<!--jq.extend({-->
<!--xiaomei2: function () {-->
<!--f();-->
<!--}-->
<!--});-->
<!--})(jQuery);-->
<script>
// 给jQuery扩展方法
// $.extend({
// xiaomei:function () {
// console.log("我喜欢烧热水!");
// },
// liyan: function () {
// console.log("我喜欢喝热水!");
// }
// });
// // 给jQuery对象扩展方法
// $.fn.extend({
// jianchao: function () {
// console.log("喜欢晓梅!");
// },
// chenxiaomei: function () {
// console.log("你是个好人!");
// }
// })
</script>
</body>
</html>
表格的增删改查
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>作业讲解</title>
<style>
.cover {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: rgba(0, 0, 0, 0.3);
z-index: 999;
}
.modal {
position: fixed;
top: 50%;
left: 50%;
width: 400px;
height: 300px;
margin-top: -150px;
margin-left: -200px;
background-color: white;
z-index: 1000;
}
.hide {
display: none;
}
</style>
</head>
<body>
<button id="add-btn">新增</button>
<table border="1">
<thead>
<tr>
<th>#</th>
<th>姓名</th>
<th>爱好</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>晓梅</td>
<td>烧热水</td>
<td>
<button class="edit">编辑</button>
<button class="delete">删除</button>
</td>
</tr>
<tr>
<td>2</td>
<td>小雨</td>
<td>烧热水</td>
<td>
<button class="edit">编辑</button>
<button class="delete">删除</button>
</td>
</tr>
<tr>
<td>3</td>
<td>建超</td>
<td>烧热水</td>
<td>
<button class="edit">编辑</button>
<button class="delete">删除</button>
</td>
</tr>
<tr>
<td>4</td>
<td>Egon</td>
<td>烧热水</td>
<td>
<button class="edit">编辑</button>
<button class="delete">删除</button>
</td>
</tr>
<tr>
<td>5</td>
<td>李岩</td>
<td>喝热水</td>
<td>
<button class="edit">编辑</button>
<button class="delete">删除</button>
</td>
</tr>
</tbody>
</table>
<div class="cover hide"></div>
<div class="modal hide">
<p>
<label for="modal-name">姓名</label>
<input id="modal-name" type="text" name="name">
</p>
<p>
<label for="modal-hobby">爱好</label>
<input id="modal-hobby" type="text" name="hobby">
</p>
<p>
<button id="modal-submit">提交</button>
<button id="modal-cancel">取消</button>
</p>
</div>
<script src="jquery-3.2.1.min.js"></script>
<script>
// 弹出模态框函数
function showModal() {
$(".cover, .modal").removeClass("hide");
}
// 关闭模态框
function hideModal() {
$(".cover, .modal").addClass("hide");
// 清空模态框里面的input
$(".modal input").val("");
}
// 绑定事件
$(document).ready(function () {
// 添加按钮绑定事件
$("#add-btn").on("click", function () {
showModal();
});
// 模态框里面的取消按钮,绑定关闭模态框事件
$("#modal-cancel").on("click", function () {
hideModal();
});
// 表格中删除按钮绑定事件
$("tbody").on("click", ".delete", function () {
// this 当前点击的删除按钮
// $(this) --> 变成jQuery对象
var $currentTr = $(this).parent().parent();
// 更新当前行后面的所有tr的序号(tr的第一个td儿子)
$currentTr.nextAll().each(function () {
var $firstTd = $(this).children().first();
// this --> 当前循环中的那个tr
var currentNum = parseInt($firstTd.text()) - 1;
$firstTd.text(currentNum);
});
// 删除当前行
$currentTr.remove();
});
// 点击模态框里面的提交按钮,把数据添加到表格中
$("#modal-submit").on("click", function () {
// 获取模态框里面input的值
var name = $("#modal-name").val();
var hobby = $("#modal-hobby").val();
// 如果是编辑操作,我应该去更新原来的td的值
var $tds = $("#modal-submit").data("tds");
if ($tds !== undefined) {
// 能够取到$tds,表示我是一个编辑的操作
// 更新$tds
$tds.eq(1).text(name);
$tds.eq(2).text(hobby);
} else {
// 取不到tds,表示我是一个新增的操作
// 因为是新增操作,所以要创建新的tr
// 创建tr标签
var trEle = document.createElement("tr");
// 获取当前表格里面所有的tr标签的个数,正好就是我新增tr的序号
var currentNum = $("table tr").length;
$(trEle).append("<td>" + currentNum + "</td>");
$(trEle).append("<td>" + name + "</td>");
$(trEle).append("<td>" + hobby + "</td>");
$(trEle).append("<td>" + '<button class="edit">编辑</button> <button class="delete">删除</button>' + "</td>");
// 把生成的tr标签添加到tbody的最后
$(trEle).appendTo("tbody");
}
// 清空一下$tds
$("#modal-submit").removeData("tds");
// 隐藏模态框
hideModal();
});
// 编辑按钮
$("tbody").on("click", ".edit", function () {
// 显示模态框
showModal();
// 取出当前行的数据,填写到模态框里面的input中
// 1.取当前行的数据
// this 当前点击的那个编辑按钮
// 找到当前行所有的td
var $tds = $(this).parent().parent().children();
$("#modal-submit").data("tds", $tds);
var name = $tds.eq(1).text();
var hobby = $tds.eq(2).text();
console.log(name, hobby);
// 将取到的数据填写到模态框里面的input
$("#modal-name").val(name);
$("#modal-hobby").val(hobby);
})
})
</script>
</body>
</html>
登录校验jQuery版
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录校验jQuery版</title>
<style>
.error {
color: red;
}
</style>
</head>
<body>
<form action="">
<div>
<label for="name">姓名</label>
<input id="name" type="text" name="username">
<span class="error"></span>
</div>
<div>
<label for="pwd">密码</label>
<input id="pwd" type="password" name="password">
<span class="error"></span>
</div>
<div>
<input id="submit" type="submit" value="登录">
</div>
</form>
<script src="jquery-3.2.1.min.js"></script>
<script>
// 清空之前的错误信息
$("form input[type!='submit']").on("focus", function () {
$(this).next().text("");
});
// 给登录按钮绑定事件
$("#submit").on("click", function () {
var flag=true;
$("form input[type!='submit']").each(function () {
// this 指的是循环中当前的input
if ($(this).val().length === 0) {
// 此input没有填写数据,需要填写错误提示
var currentLabel = $(this).prev().text();
$(this).next().text(currentLabel + "不能为空");
// 将标志位置为false,阻止后续submit自带的提交事件
flag =false;
// 终止each循环
return false;
}
});
return flag;
})
</script>
</body>
</html>
登录校验jQuery插件版
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录校验jQuery版</title>
<style>
.error {
color: red;
}
</style>
</head>
<body>
<form action="">
<div>
<label for="name">姓名</label>
<input id="name" type="text" name="username" egon="true">
<span class="error"></span>
</div>
<div>
<label for="pwd">密码</label>
<input id="pwd" type="password" name="password" egon="true">
<span class="error"></span>
</div>
<div>
<label for="mobile">手机</label>
<input id="mobile" type="text" name="mobile" egon="true">
<span class="error"></span>
</div>
<div>
<label for="from">来自</label>
<input id="from" type="text" name="from">
<span class="error"></span>
</div>
<div>
<input id="submit" type="submit" value="登录">
</div>
</form>
<script src="jquery-3.2.1.min.js"></script>
<!--下面引用很多很多别人写好的jQuery插件-->
<script src="07-extend示例1.js"></script>
<!--// 清空之前的错误信息-->
<!--$("form input[type!='submit']").on("focus", function () {-->
<!--$(this).next().text("");-->
<!--});-->
<!--// 给登录按钮绑定事件-->
<!--// $("#submit").on("click", function () {-->
<!--// var flag = true;-->
<!--// $("form input[type!='submit']").each(function () {-->
<!--// // this 指的是循环中当前的input-->
<!--// if ($(this).val().length === 0) {-->
<!--// // 此input没有填写数据,需要填写错误提示-->
<!--// var currentLabel = $(this).prev().text();-->
<!--// $(this).next().text(currentLabel + "不能为空");-->
<!--// // 将标志位置为false,阻止后续submit自带的提交事件-->
<!--// flag = false;-->
<!--// // 终止each循环-->
<!--// return false;-->
<!--// }-->
<!--// });-->
<!--// return flag;-->
<!--// });-->
<!--// 把我这个插件用到的所有变量和函数都放在一个自执行函数中-->
<!--(function ($) {-->
<!--function f() {-->
<!--var flag = true;-->
<!--$("form input[type!='submit']").each(function () {-->
<!--// this 指的是循环中当前的input-->
<!--var inputName = $(this).attr("name");-->
<!--// 取到当前input的val值-->
<!--var inputValue = $(this).val();-->
<!--// 根据不同情况,灵活做判断-->
<!--// 判断是否为必填项-->
<!--if ($(this).attr("egon") === "true") {-->
<!--// 判断为不为空-->
<!--if ($(this).val().length === 0) {-->
<!--// 此input没有填写数据,需要填写错误提示-->
<!--var currentLabel = $(this).prev().text();-->
<!--$(this).next().text(currentLabel + "不能为空");-->
<!--// 将标志位置为false,阻止后续submit自带的提交事件-->
<!--flag = false;-->
<!--// 终止each循环-->
<!--return false;-->
<!--}-->
<!--// 判断密码是否符合要求-->
<!--if ($(this).attr("type") ==="password") {-->
<!--if (inputValue.length < 6){-->
<!--// 写提示信息-->
<!--var currentLabel = $(this).prev().text();-->
<!--$(this).next().text(currentLabel + "长度不能小于6位");-->
<!--flag = false;-->
<!--return false;-->
<!--}-->
<!--};-->
<!--// r如果是手机号,用正则表达式来校验下是否为正常的手机号-->
<!--if (inputName === "mobile") {-->
<!--if (!/^1[34578]\d{9}$/.test(inputValue)){-->
<!--// 不合法的手机号-->
<!--var currentLabel = $(this).prev().text();-->
<!--$(this).next().text(currentLabel + "格式不正确");-->
<!--flag = false;-->
<!--return false;-->
<!--}-->
<!--}-->
<!--}-->
<!--});-->
<!--return flag;-->
<!--}-->
<!--// 把上面的校验写成一个jQuery扩展-->
<!--$.extend({-->
<!--check: function () {-->
<!--$("#submit").on("click", function () {-->
<!--return f();-->
<!--})-->
<!--}-->
<!--});-->
<!--})(jQuery);-->
<script src="extend2.js"></script>
<!--function f() {-->
<!--console.log("我是来自extend2.js里面的函数f");-->
<!--}-->
<!--var name = "Alex2";-->
<script>
$.check();
</script>
</body>
</html>
*****总结*****
jQuery
1. 找标签
1. 基本查找 $("条件都写在这里")
1. ID查找 -> $("#ID值")
2. class查找 -> $(".class名字")
3. 标签查找 -> $("标签名")
4. * -> $("*")
5. 结合来用 -> $("div.c1") $("p.c2")
6. 组合查询 -> $("条件1,条件2") $("div,p")
2. 层级查找
1. 后代选择器 -> $("x y")
2. 儿子选择器 -> $("x>y")
3. 弟弟选择器 -> $("x~y")
4. 毗邻选择器 -> $("x+y")
3. 筛选器
1. :first
2. :last
3. :eq(index)
4. :gt(index)
5. :lt(index)
6. :even
7. :odd
4. 筛选器方法
1. 下一个(同级的标签/弟弟标签)
- next()
- nextAll()
- nextUntil(“终止条件”) (不包含终止条件)
2. 上一个(同级的标签/姐姐标签)
- prev()
- prevAll()
- prevUntil(“终止条件”) (不包含终止条件)
3. 父标签系列
- parent()
5. 操作标签
1. 样式操作
1. addClass
2. removeClass
3. toggleClass
2. CSS操作
3. 位置
position
1. fixed
2. relative --> 相对位置,相对自己原来应该在的位置
3. absolute --> 绝对位置,相对上一级相对定位过的父标签
4. static
jQuery
offset 获取相对当前窗口的偏移 {top: xx, left: xxx}
position 相当于已经定位父标签的偏移 {top:xx, left:xx}
offset({top: xx,left:xx}) --> 可以设置标签相对当前窗口的偏移
6. 尺寸 (CSS盒子模型)
height()
width()
innerHeight()
innerWidth()
outerHeight()
outerWidth()
7. 文本操作
DOM:
innerHTML
innerText
jQuery:
.html()
.text()
8. 属性操作
val()
*****取值是默认取第一个匹配元素的值*****
*****设置值是设置所有的标签的值*****
attr()
获取ID、自定义属性
prop()
推荐用于获取和设置checkbox和radio的值
DOM对象转化为jQuery对象-->jQuery对象=$(DOM对象)
jQuery对象转化为DOM对象-->DOM对象=jQuery对象[索引]
二者的属性和方法不能互相通用
jQuery变量名推荐加$前缀
each循环
1. $.each()
2. $("").each()
- 注意:this具体指的是谁(进入循环的当前对象)
- return false 后面的时间或函数不执行
- 如果一个jQuery查找的对象被多次用到,我们可以用变量把它保存起来,减少重复查找
文档操作
各种插入
1. 内部插入 (子标签)
往前插 prepend
往后插 append
2. 外部插入 (同级)
往后插 after
往前插 before
3. 替换
A.replaceWith(B) --> B替换A
A.replaceAll(B) --> A替换所有的B
4. 克隆
注意参数:true,加上true表示标签和事件都复制
常用事件和事件绑定
按键按下事件 --> 批量操作
.on()
事件委托
原理:利用事件冒泡--> 父标签捕获事件->处理事件
$("已经存在的标签").on("事件", "选择器", function(){...})
动画效果
- 基本
- 淡入
- 滑动
- 自定义
.data()方法
.data("k1", "v1") 保存任意数据
.data("k1") 获取k1对应的数据
.removeData("k1") 清除k1对应的数据
.removeData() 清除所有数据
示例:
table增删改查
jQuery扩展
给jQuery扩展方法
$.extend({
funcName: function(){...},
})
给jQuery对象扩展方法
$.fn.extend({
funcName: function(){...},
})
用到的JS知识点
1. JS中变量作用域由谁控制的? --> 函数外部访问不到函数内部的变量
2. 匿名函数
function(){...}
3. 自执行函数
(function(arg){...})(arg);
示例:
自定义登录校验插件