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内容: 选择器 筛选器 样式操作 文本操作 属性操作 文档处理 事件 动画效果 插件 each、data、Ajax 下载链接:jQuery官网
中文文档:jQuery AP中文文档
jQuery版本 1.x:兼容IE678,使用最为广泛的,官方只做BUG维护,功能不再新增。因此一般项目来说,使用1.x版本就可以了,最终版本:1.12.4 (2016年5月20日) 2.x:不兼容IE678,很少有人使用,官方只做BUG维护,功能不再新增。如果不考虑兼容低版本的浏览器可以使用2.x,最终版本:2.2.4 (2016年5月20日) 3.x:不兼容IE678,只支持最新的浏览器。需要注意的是很多老的jQuery插件不支持3.x版。目前该版本是官方主要更新维护的版本。 维护IE678是一件让人头疼的事情,一般我们都会额外加载一个CSS和JS单独处理。值得庆幸的是使用这些浏览器的人也逐步减少,PC端用户已经逐步被移动端用户所取代,如果没有特殊要求的话,一般都会选择放弃对678的支持。
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对象变量的时候在变量名前面加上$:
1 2 3 var $variable = jQuery对像var variable = DOM 对象$variable[0 ]
拿上面那个例子举例,jQuery对象和DOM对象的使用:
1 2 $("#i1" ).html (); $("#i1" )[0 ].innerHTML ;
jQuery基础语法 查找标签 基本选择器 id选择器:
标签选择器:
class选择器:
配合使用:
1 $("div.c1") // 找到有c1 class类的div标签
所有元素选择器:
组合选择器:
1 $("#id, .className, tagName")
层级选择器: x和y可以为任意选择器
1 2 3 4 $("x y" ); $("x > y" ); $("x + y" ) $("x ~ y" )
基本筛选器: 1 2 3 4 5 6 7 8 9 :first :last :eq (index) :even :odd :gt (index) :lt (index) :not (元素选择器) :has (元素选择器)
例子:
1 2 3 4 $("div:has(h1)" ) $("div:has(.c1)" ) $("li:not(.c1)" ) $("li:not(:has(a))" )
练习:
自定义模态框,使用jQuery实现弹出和隐藏功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 <!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 >
属性选择器: 1 2 3 [attribute] [attribute=value] [attribute!=value]
例子:
1 2 3 4 5 6 <input type="text" > <input type="password"> <input type="checkbox"> $("input[type='checkbox']");// 取到checkbox类型的input标签 $("input[type!='text']");// 取到类型不是text的input标签
表单筛选器 :1 2 3 4 5 6 7 :text :password :file :radio :checkbox :submit :reset :button
例子:
1 $(":checkbox") // 找到所有的checkbox
表单对象属性:
1 2 3 4 :enabled :disabled :checked :selected
例子:
找到可用的input标签
1 2 3 4 5 6 <form> <input name ="email" disabled ="disabled" /> <input name ="id" /> </form> $("input:enabled" )
找到被选中的option:
1 2 3 4 5 6 7 8 <select id="s1" > <option value ="beijing" > 北京市</option > <option value ="shanghai" > 上海市</option > <option selected value ="guangzhou" > 广州市</option > <option value ="shenzhen" > 深圳市</option > </select> $(":selected" )
筛选器方法 下一个元素:
1 2 3 $("#id" ).next () $("#id" ).nextAll () $("#id" ).nextUntil ("#i2" )
上一个元素:
1 2 3 $("#id" ).prev () $("#id" ).prevAll () $("#id" ).prevUntil ("#i2" )
父亲元素:
1 2 $("#id" ).parent () $("#id" ).parents ()
儿子和兄弟元素:
1 2 $("#id" ).children (); $("#id" ).siblings ();
查找
搜索所有与指定表达式匹配的元素。这个函数是找出正在处理的元素的后代元素的好方法。
等价于$(“div p”)
筛选
筛选出与指定表达式匹配的元素集合。这个方法用于缩小匹配的范围。用逗号分隔多个表达式。
等价于 $(“div.c1”)
补充:
1 2 3 4 5 .first () .last () .not () .has () .eq ()
示例:左侧菜单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 <!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 ( ){ $(".items" ).addClass ("hide" ); $(this ).next ().removeClass ("hide" ); }); </script >
操作标签 样式操作 样式类
1 2 3 4 addClass ();removeClass ();hasClass ();toggleClass ();
示例:开关灯和模态框
CSS
示例:
1 $("p" ).css ("color" , "red" );
位置操作 1 2 3 4 offset ()position ()scrollTop ()scrollLeft ()
.offset()
方法允许我们检索一个元素相对于文档(document)的当前位置。
和 .position()
的差别在于: .position()
是相对于相对于父级元素的位移。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 <!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 >
尺寸: 1 2 3 4 5 6 height() width() innerHeight() innerWidth() outerHeight() outerWidth()
文本操作 HTML代码:
1 2 html()// 取得第一个匹配元素的html内容 html(val)// 设置所有匹配元素的html内容
文本值:
1 2 text()// 取得所有匹配元素的内容 text(val)// 设置所有匹配元素的内容
值:
1 2 3 val()// 取得第一个匹配元素的当前值 val(val)// 设置所有匹配元素的值 val([val1, val2])// 设置多选的checkbox、多选select的值
例如:
1 2 3 4 5 6 7 8 <input type="checkbox" value="basketball" name="hobby" >篮球 <input type="checkbox" value="football" name="hobby" >足球 <select multiple id="s1" > <option value ="1" > 1</option > <option value ="2" > 2</option > <option value ="3" > 3</option > </select>
设置值:
1 2 $("[name='hobby']" ).val (['basketball' , 'football' ]); $("#s1" ).val (["1" , "2" ])
示例:
获取被选中的checkbox或radio的值:
1 2 3 4 <label for ="c1" >女</label> <input name="gender" id="c1" type="radio" value="0"> <label for="c2">男</label> <input name="gender" id="c2" type="radio" value="1">
可以使用:
1 $("input[name='gender']:checked" ).val ()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 <!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 ="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js" > </script > <script > $("#btn" ).click (function ( ) { var username = $("#input-name" ).val (); var password = $("#input-password" ).val (); if (username.length === 0 ) { $("#input-name" ).siblings (".error" ).text ("用户名不能为空" ); } if (password.length === 0 ) { $("#input-password" ).siblings (".error" ).text ("密码不能为空" ); } }) </script > </body > </html >
属性操作 用于ID等或自定义属性:
1 2 3 4 attr (attrName)attr (attrName, attrValue)attr ({k1 : v1, k2 :v2})removeAttr ()
用于checkbox和radio
注意:
在1.x及2.x版本的jQuery中使用attr对checkbox进行赋值操作时会出bug,在3.x版本的jQuery中则没有这个问题。为了兼容性,我们在处理checkbox和radio的时候尽量使用特定的prop(),不要使用attr(“checked”, “checked”)。
1 2 3 4 5 6 <input type="checkbox" value="1" > <input type ="radio" value ="2" > <script > $(":checkbox[value='1']" ).prop ("checked" , true ); $(":radio[value='2']" ).prop ("checked" , true ); </script >
prop和attr的区别:
attr全称attribute(属性)
prop全称property(属性)
虽然都是属性,但他们所指的属性并不相同,attr所指的属性是HTML标签属性,而prop所指的是DOM对象属性,可以认为attr是显式的,而prop是隐式的。
举个例子:
1 <input type="checkbox" id="i1" value="1" >
针对上面的代码,
1 2 $("#i1" ).attr ("checked" ) $("#i1" ).prop ("checked" )
可以看到attr获取一个标签内没有的东西会得到undefined,而prop获取的是这个DOM对象的属性,因此checked为false。
如果换成下面的代码:
1 <input type="checkbox" checked id="i1" value="1" >
再执行:
1 2 $("#i1" ).attr ("checked" ) $("#i1" ).prop ("checked" )
这已经可以证明attr的局限性,它的作用范围只限于HTML标签内的属性,而prop获取的是这个DOM对象的属性,选中返回true,没选中返回false。
接下来再看一下针对自定义属性,attr和prop又有什么区别:
1 <input type="checkbox" checked id="i1" value="1" me="自定义属性" >
执行以下代码:
1 2 $("#i1" ).attr ("me" ) $("#i1" ).prop ("me" )
可以看到prop不支持获取标签的自定义属性。
总结一下:
对于标签上有的能看到的属性和自定义属性都用attr 对于返回布尔值的比如checkbox、radio和option的是否被选中都用prop。 练习题:全选、反选、取消
文档处理 添加到指定元素内部 的后面
1 2 $(A).append (B) $(A).appendTo (B)
添加到指定元素内部 的前面
1 2 $(A).prepend (B) $(A).prependTo (B)
添加到指定元素外部 的后面
1 2 $(A).after (B) $(A).insertAfter (B)
添加到指定元素外部 的前面
1 2 $(A).before (B) $(A).insertBefore (B)
移除和清空元素
例子:
点击按钮在表格添加一行数据。
点击每一行的删除按钮删除当前行数据。
替换
1 2 replaceWith ()replaceAll ()
克隆
克隆示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 <!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 > #b1 { background-color : deeppink; padding : 5px ; color : white; margin : 5px ; } #b2 { background-color : dodgerblue; padding : 5px ; color : white; margin : 5px ; } </style > </head > <body > <button id ="b1" > 屠龙宝刀,点击就送</button > <hr > <button id ="b2" > 屠龙宝刀,点击就送</button > <script src ="jquery-3.2.1.min.js" > </script > <script > $("#b1" ).on ("click" , function ( ) { $(this ).clone ().insertAfter (this ); }); $("#b2" ).on ("click" , function ( ) { $(this ).clone (true ).insertAfter (this ); }); </script > </body > </html >
事件 常用事件 1 2 3 4 5 6 click(function(){...}) hover(function(){...}) blur(function(){...}) focus(function(){...}) change(function(){...}) keyup(function(){...})
keydown和keyup事件组合示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 <!DOCTYPE html > <html lang ="zh-CN" > <head > <meta http-equiv ="content-Type" charset ="UTF-8" > <meta http-equiv ="x-ua-compatible" content ="IE=edge" > <title > 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.3.1.js" > </script > <script > var flag = false ; $(window ).keydown (function (event ) { console .log (event.keyCode ); if (event.keyCode === 16 ){ flag = true ; } }); $(window ).keyup (function (event ) { console .log (event.keyCode ); if (event.keyCode === 16 ){ flag = false ; } }); $("select" ).change (function (event ) { console .log ($(this ).parent ().siblings ().first ().find (":checkbox" )); var isChecked = $(this ).parent ().siblings ().first ().find (":checkbox" ).prop ("checked" ); console .log (isChecked); if (flag && isChecked) { var value = $(this ).val (); var $select = $("input:checked" ).parent ().parent ().find ("select" ) $select.val (value); } }); </script > </body > </html >
hover事件示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 <!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 > hover示例</title > <style > * { margin : 0 ; padding : 0 ; } .nav { height : 40px ; width : 100% ; background-color : #3d3d3d ; position : fixed; top : 0 ; } .nav ul { list-style-type : none; line-height : 40px ; } .nav li { float : left; padding : 0 10px ; color : #999999 ; position : relative; } .nav li :hover { background-color : #0f0f0f ; color : white; } .clearfix :after { content : "" ; display : block; clear : both; } .son { position : absolute; top : 40px ; right : 0 ; height : 50px ; width : 100px ; background-color : #00a9ff ; display : none; } .hover .son { display : block; } </style > </head > <body > <div class ="nav" > <ul class ="clearfix" > <li > 登录</li > <li > 注册</li > <li > 购物车 <p class ="son hide" > 空空如也... </p > </li > </ul > </div > <script src ="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js" > </script > <script > $(".nav li" ).hover ( function ( ) { $(this ).addClass ("hover" ); }, function ( ) { $(this ).removeClass ("hover" ); } ); </script > </body > </html >
实时监听input输入值变化示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <!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>实时监听input输入值变化</title> </head> <body> <input type="text" id="i1"> <script src="jquery-3.2.1.min.js"></script> <script> /* * oninput是HTML5的标准事件 * 能够检测textarea,input:text,input:password和input:search这几个元素的内容变化, * 在内容修改后立即被触发,不像onchange事件需要失去焦点才触发 * oninput事件在IE9以下版本不支持,需要使用IE特有的onpropertychange事件替代 * 使用jQuery库的话直接使用on同时绑定这两个事件即可。 * */ $("#i1").on("input propertychange", function () { alert($(this).val()); }) </script> </body> </html>
事件绑定 .on( events [, selector ],function(){})
events: 事件 selector: 选择器(可选的) function: 事件处理函数 移除事件 .off( events [, selector ][,function(){}])
off()
方法移除用 .on()
绑定的事件处理程序。
events: 事件 selector: 选择器(可选的) function: 事件处理函数 阻止后续事件执行 return false; // 常见阻止表单提交等
e.preventDefault(); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <!DOCTYPE html> <html lang ="en" > <head > <meta charset ="UTF-8" > <title > 阻止默认事件</title > </head > <body > <form action ="" > <button id ="b1" > 点我</button > </form > <script src ="jquery-3.3.1.min.js" > </script > <script > $("#b1" ).click (function (e ) { alert (123 ); e.preventDefault (); }); </script > </body > </html >
注意:
像click、keydown等DOM中定义的事件,我们都可以使用.on()
方法来绑定事件,但是hover
这种jQuery中定义的事件就不能用.on()
方法来绑定了。
想使用事件委托的方式绑定hover事件处理函数,可以参照如下代码分两步绑定事件:
1 2 3 4 5 6 $('ul' ).on ('mouseenter' , 'li' , function ( ) { $(this ).addClass ('hover' ); }); $('ul' ).on ('mouseleave' , 'li' , function ( ) { $(this ).removeClass ('hover' ); });
阻止事件冒泡 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <!DOCTYPE html> <html lang ="en" > <head > <meta charset ="UTF-8" > <title > 阻止事件冒泡</title > </head > <body > <div > <p > <span > 点我</span > </p > </div > <script src ="jquery-3.3.1.min.js" > </script > <script > $("span" ).click (function (e ) { alert ("span" ); e.stopPropagation (); }); $("p" ).click (function ( ) { alert ("p" ); }); $("div" ).click (function ( ) { alert ("div" ); }) </script > </body > </html >
页面载入 当DOM载入就绪可以查询及操纵时绑定一个要执行的函数。这是事件模块中最重要的一个函数,因为它可以极大地提高web应用程序的响应速度。
两种写法:
1 2 3 $(document ).ready (function ( ){ })
简写:
文档加载完绑定事件,并且阻止默认事件发生:
登录校验示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 <!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 ( ) { 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 ; } }); return flag; }); $myForm.find ("input[type!='submit']" ).on ("focus" , function ( ) { $(this ).next (".error" ).text ("" ); }) } $(document ).ready (function ( ) { myValidation (); }); </script > </body > </html >
与window.onload的区别 window.onload()函数有覆盖现象,必须等待着图片资源加载完成之后才能调用 jQuery的这个入口函数没有函数覆盖现象,文档加载完成之后就可以调用(建议使用此函数) 事件委托 事件委托是通过事件冒泡的原理,利用父标签去捕获子标签的事件。
示例:
表格中每一行的编辑和删除按钮都能触发相应的事件。
1 2 3 $("table" ).on ("click" , ".delete" , function ( ) { })
动画效果 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 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])
自定义动画示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 <!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>
补充 each jQuery.each(collection, callback(indexInArray, valueOfElement)):
描述:一个通用的迭代函数,它可以用来无缝迭代对象和数组。数组和类似数组的对象通过一个长度属性(如一个函数的参数对象)来迭代数字索引,从0到length - 1。其他对象通过其属性名进行迭代。
1 2 3 4 li =[10 ,20 ,30 ,40 ] $.each (li,function (i, v ){ console .log (i, v); })
输出:
.each(function(index, Element)):
描述:遍历一个jQuery对象,为每个匹配元素执行一个函数。
.each()
方法用来迭代jQuery对象中的每一个DOM元素。每次回调函数执行时,会传递当前循环次数作为参数(从0开始计数)。由于回调函数是在当前DOM元素为上下文的语境中触发的,所以关键字 this
总是指向这个元素。
1 2 3 4 $("li" ).each (function ( ){ $(this ).addClass ("c1" ); });
注意: jQuery的方法返回一个jQuery对象,遍历jQuery集合中的元素 - 被称为隐式迭代 的过程。当这种情况发生时,它通常不需要显式地循环的 .each()
方法:
也就是说,上面的例子没有必要使用each()方法,直接像下面这样写就可以了:
注意:
在遍历过程中可以使用 return false
提前结束each循环。
终止each循环
伏笔…
.data() 在匹配的元素集合中的所有元素上存储任意相关数据或返回匹配的元素集合中的第一个元素的给定名称的数据存储的值。
.data(key, value):
描述:在匹配的元素上存储任意相关数据。
.data(key):
描述: 返回匹配的元素集合中的第一个元素的给定名称的数据存储的值—通过 .data(name, value)
或 HTML5 data-*
属性设置。
.removeData(key):
描述:移除存放在元素上的数据,不加key参数表示移除所有保存的数据。
1 $("div" ).removeData ("k" );
示例:
模态框编辑的数据回填表格
插件(了解即可) jQuery.extend(object)
jQuery的命名空间下添加新的功能。多用于插件开发者向 jQuery 中添加新函数时使用。
示例:
1 2 3 4 5 6 7 8 <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 ); jQuery.max (4 ,5 ); </script>
jQuery.fn.extend(object)
一个对象的内容合并到jQuery的原型,以提供新的jQuery实例方法。
1 2 3 4 5 6 7 8 9 10 11 12 <script> jQuery.fn .extend ({ check :function ( ){ return this .each (function ( ){this .checked =true ;}); }, uncheck :function ( ){ return this .each (function ( ){this .checked =false ;}); } }); $("input[type='checkbox']" ).check (); </script>
单独写在文件中的扩展:
1 2 3 4 5 6 7 (function (jq ){ jq.extend ({ funcName :function ( ){ ... }, }); })(jQuery);
例子:
自定义的jQuery登录验证插件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 <!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 > .login-form { margin : 100px auto 0 ; max-width : 330px ; } .login-form > div { margin : 15px 0 ; } .error { color : red; } </style > </head > <body > <div > <form action ="" class ="login-form" novalidate > <div > <label for ="username" > 姓名</label > <input id ="username" type ="text" name ="name" required autocomplete ="off" > <span class ="error" > </span > </div > <div > <label for ="passwd" > 密码</label > <input id ="passwd" type ="password" name ="password" required autocomplete ="off" > <span class ="error" > </span > </div > <div > <label for ="mobile" > 手机</label > <input id ="mobile" type ="text" name ="mobile" required autocomplete ="off" > <span class ="error" > </span > </div > <div > <label for ="where" > 来自</label > <input id ="where" type ="text" name ="where" autocomplete ="off" > <span class ="error" > </span > </div > <div > <input type ="submit" value ="登录" > </div > </form > </div > <script src ="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js" > </script > <script src ="validate.js" > </script > <script > $.validate (); </script > </body > </html >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 "use strict" ;(function ($ ) { function check ( ) { var flag = true ; var errMsg; $("form input[type!=':submit']" ).each (function ( ) { var labelName = $(this ).prev ().text (); var inputName = $(this ).attr ("name" ); var inputValue = $(this ).val (); if ($(this ).attr ("required" )) { if (inputValue.length === 0 ) { errMsg = labelName + "不能为空" ; $(this ).next ().text (errMsg); flag = false ; return false ; } if (inputName === "password" ) { if (inputValue.length < 6 ) { errMsg = labelName + "必须大于6位" ; $(this ).next ().text (errMsg); flag = false ; return false ; } } if (inputName === "mobile" ) { if (!/^1[345678]\d{9}$/ .test (inputValue)) { errMsg = labelName + "格式不正确" ; $(this ).next ().text (errMsg); flag = false ; return false ; } } } }); return flag; } function clearError (arg ) { $(arg).next ().text ("" ); } $.extend ({ validate : function ( ) { $("form :submit" ).on ("click" , function ( ) { return check (); }); $("form :input[type!='submit']" ).on ("focus" , function ( ) { clearError (this ); }); } }); })(jQuery);
传参版插件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 <!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 > .login-form { margin : 100px auto 0 ; max-width : 330px ; } .login-form > div { margin : 15px 0 ; } .error { color : red; } </style > </head > <body > <div > <form action ="" class ="login-form" novalidate > <div > <label for ="username" > 姓名</label > <input id ="username" type ="text" name ="name" required autocomplete ="off" > <span class ="error" > </span > </div > <div > <label for ="passwd" > 密码</label > <input id ="passwd" type ="password" name ="password" required autocomplete ="off" > <span class ="error" > </span > </div > <div > <label for ="mobile" > 手机</label > <input id ="mobile" type ="text" name ="mobile" required autocomplete ="off" > <span class ="error" > </span > </div > <div > <label for ="where" > 来自</label > <input id ="where" type ="text" name ="where" autocomplete ="off" > <span class ="error" > </span > </div > <div > <input type ="submit" value ="登录" > </div > </form > </div > <script src ="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js" > </script > <script src ="validate3.js" > </script > <script > $.validate ({"name" :{"required" : true }, "password" : {"required" : true , "minLength" : 8 }, "mobile" : {"required" : true }}); </script > </body > </html >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 "use strict" ;(function ($ ) { function check (arg ) { var flag = true ; var errMsg; $("form input[type!=':submit']" ).each (function ( ) { var labelName = $(this ).prev ().text (); var inputName = $(this ).attr ("name" ); var inputValue = $(this ).val (); if (arg[inputName].required ) { if (inputValue.length === 0 ) { errMsg = labelName + "不能为空" ; $(this ).next ().text (errMsg); flag = false ; return false ; } if (inputName === "password" ) { if (inputValue.length < arg[inputName].minLength ) { errMsg = labelName + "必须大于" +arg[inputName].minLength +"位" ; $(this ).next ().text (errMsg); flag = false ; return false ; } } if (inputName === "mobile" ) { if (!/^1[345678]\d{9}$/ .test (inputValue)) { errMsg = labelName + "格式不正确" ; $(this ).next ().text (errMsg); flag = false ; return false ; } } } }); return flag; } function clearError (arg ) { $(arg).next ().text ("" ); } $.extend ({ validate : function (arg ) { $("form :submit" ).on ("click" , function ( ) { return check (arg); }); $("form :input[type!='submit']" ).on ("focus" , function ( ) { clearError (this ); }); } }); })(jQuery);