1. 事件 常用事件: click(function(){...}) hover(function(){...}) blur(function(){...}) focus(function(){...}) change(function(){...}) keydown(function(){...}) keyup(function(){...}) 1.1 我们今后要用的jQuery绑定事件的方式 1.1.1 点击的标签对象.on("click", function(){...}) 1.1.2 父对象.on("click", "点击的标签对象的id、classname、tagname等等", function(){...}) 优点: 1.适用于 给未来的元素(页面生成的时候还没有的标签) 绑定事件 (事件委托), 子元素无法处理的,委托给父元素处理。 2.事件冒泡 子元素无法处理的,委托给父元素处理,父元素无法处理的,委托给爷爷元素处理。 把事件向上级汇报处理。 3.事件捕获 利用事件冒泡,给已经存在的标签绑定事件,用来捕获后代标签的事件. 示例:新增一行,并且可以删除这一行。 $("table").on("click", ".delete", function () { // 删除按钮绑定的事件 }) 1.2 hover事件示例: <!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: red; 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"> 空空如也... </p> </li> </ul> </div> <script src="jquery-3.4.1.min.js"></script> <script> $(".nav li").hover( function () { $(this).addClass("hover"); },//两函数使用逗号隔开 function () { $(this).removeClass("hover"); } ); </script> </body> </html> 1.3 阻止后续事件执行 return false; // 常见阻止表单提交等 1.4 移除事件 .off("click", function(){...}) 1.5 页面载入 当DOM载入就绪可以查询及操纵时绑定一个要执行的函数。 这是事件模块中最重要的一个函数,因为它可以极大地提高web应用程序的响应速度。
两种写法:
$(document).ready(function(){
// 在这里写你的JS代码...
})
简写:
$(function(){
// 你在这里写你的代码
})
示例: <body> <script> function foo() { // 在这里写你的JS代码... } // 文档树就绪后执行 $(document).ready( function () { foo(); } ); </script> </body> 2. 动画效果 // 基本 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]]) // o是opacity透明度 fadeToggle([s,[e],[fn]]) // 自定义(了解即可) animate(p,[s],[e],[fn]) 2.1 基本示例:图片展示和隐藏 <img src="1.jpg" alt=""> $('img').show(5000); //图片在5秒内从小到大展示完成 $('img').hide(5000); //图片在5秒内从打到小隐藏完成 $('img').toggle(5000); //图片在5秒内,有图片就隐藏,没有图片就展示出来 2.2 滑动示例:菜单隐藏 <div>菜单一</div> <div> <ul> <li>111</li> <li>222</li> <li>333</li> </ul> </div> $('ul').slideUp(1000); //向上滑动隐藏 $('ul').slideDown(1000); //向下滑动展示 $('ul').slideToggle(1000); //展示变隐藏,隐藏变展示 2.3 淡入淡出:图片展示和隐藏 <img src="1.jpg" alt=""> $('img').fadeIn(5000); //图片在5秒内淡入展示 $('img').fadeOut(5000); //图片在5秒内淡出隐藏 $('img').fadeToggle(5000); //图片在5秒内,有图片就淡出,没有图片就淡入 $('img').fadeTo(3000,0.3); //图片在3秒内,透明度变为0.3 2.4 自定义 示例:点赞特效。有个问题,每次点击都增加一个i标签。 <!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> 3. each循环 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>001</div> <div>002</div> <div>003</div> <div>004</div> <div>005</div> <script src="jquery-3.4.1.min.js"></script> <script> var $divEles = $('div'); for (var i = 0; i < $divEles.length; i++) { console.log($divEles[i].innerText) } //上下两个循环结果一样
//jquery对象的循环 $divEles.each(function () { //each是指$divEles对象的每一个元素 console.log($(this).text()); //$(this)就是$divEles,写一个this语句就行 });
//数组的循环 var a1 = [11,22,33,44,55]; $.each(a1,function (index,value) { if(value===22){return false}//断开each循环 console.log(index+':'+value); }); //0:11 $.each(a1,function (index,value) { if(value===22){return}//退出当前这一次循环 console.log(index+':'+value); }); //0:11 //2:33 //3:44 //4:55
//对象的循环
var dict = {'name':'tom','age':18};
$.each(dict,function(key,value){
console.log(key,value)
})
</script> </body> </html> 4. data:最重要的用法是:保存点击过的jQuery对象,方便后面找到它使用。详见示例:表格、新增、编辑、删除、each、data、事件委托 jQuery对象可以存放 数字、字符串和jQuery对象 示例: <div id="d1">迈腾2020</div> <img src="1.jpg" alt=""> 4.1 数字: $('#d1').data('age',18); $('#d1').data('age'); //结果是18 4.2 字符串: $('#d1').data('name','maiteng'); $('#d1').data('name'); //'maiteng' 4.3 jQuery对象 var $imgEle = $('img'); $('#d1').data('img',$imgEle); //找到一个对象$('#d1')(任意jQuery对象都可以),保存jQuery对象$imgEle。 $('#d1').data('img'); //获取$imgEle对象 $('#d1').data('img').attr('src','4.jpg') //属性修改
4.4 data传参
<div data-name="tom" data-age="18"></div> //把键值对{‘name’:"tom",‘age’:18}保存在div标签里面。
<button id="btn">获取数据</button>
<button id="btn1">设置数据</button>
$(function () {
$('#btn').on('click',function () {
// 获取数据
console.log($('div').data('name')); //tom
console.log($('div').data('age')); //18
});
$('#btn1').on('click',function () {
// 设置数据
$('div').data('name','marry');
$('div').data('age','20');
//$('div').data({'name':'marry','age':'20'});可以使用键值对设置,更加方便
});
});
5. 插件:自定义新函数jQuery.extend({键值对}); 示例: <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> ----------------------------------------------------------------------------------------------------- 示例:表格、新增、编辑、删除、each、data、事件委托 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>表格</title> <style> th,td { text-align: center; } .cover{ background-color:rgba(0,0,0,0.4); position:fixed; top:0; right:0; bottom:0; left:0; } .modal-new,.modal-modify{ background-color:white; width:300px; height:200px; position:fixed; top:50%; left:50%; margin-top:-100px; margin-left:-150px; } .hide{display:none;} </style> </head> <body> <table border="1"> <thead> <tr> <th>序号</th> <th>姓名</th> <th>年龄</th> <th>操作</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>tom</td> <td>18</td> <td> <input type="button" value="编辑" class="modify"> <input type="button" value="删除" class="cancel"> </td> </tr> <tr> <td>2</td> <td>marry</td> <td>20</td> <td> <input type="button" value="编辑" class="modify"> <input type="button" value="删除" class="cancel"> </td> </tr> <tr> <td>3</td> <td>alex</td> <td>38</td> <td> <input type="button" value="编辑" class="modify"> <input type="button" value="删除" class="cancel"> </td> </tr> </tbody> </table> <input type="button" id="new" value="新增"> <div class="cover hide"></div> <form class="modal-new hide" action=""> <p>新增数据</p> <p> <label for="newName">姓名</label> <input type="text" id="newName"> </p> <p> <label for="newAge">年龄</label> <input type="text" id="newAge"> </p> <p> <input type="button" value="确定" id="newSure"> <input type="button" value="退出" id="newExit"> </p> </form> <form class="modal-modify hide" action=""> <p>修改数据</p> <p> <label for="modifyName">姓名</label> <input type="text" id="modifyName"> </p> <p> <label for="modifyAge">年龄</label> <input type="text" id="modifyAge"> </p> <p> <input type="button" value="确定" id="modifySure"> <input type="button" value="退出" id="modifyExit"> </p> </form> <script src="jquery-3.4.1.min.js"></script> <script> //把经常使用的对象存放在变量里面。 var $tbodyEles = $('tbody'); //------------------新增开始--------------------------------- //1.新增一行 //1.1 点击新增,弹出模态框:cover和modal-new $('#new').on('click',function () { $('.cover,.modal-new').removeClass('hide'); //1.2 创建tr和td标签。 var trEles = document.createElement('tr'); $(trEles).html('<td></td>'+'<td></td>'+'<td></td>'+'<td><input type="button" value="编辑" class="modify"> <input type="button" value="删除" class="cancel"></td>'); $tbodyEles.append(trEles); //1.3 第一个td标签添加序号。 //1.3.1 先找到tbody有多少个tr,tr的个数就是序号。 var num = $('tbody tr').length; $(trEles).children().first().text(num); }); //2.点新增弹出来的模态框的确定,获取姓名和年龄的值,赋予新创建的td。 $('#newSure').on('click',function () { $tbodyEles.children().last().children().eq(1).text($('#newName').val()); $tbodyEles.children().last().children().eq(2).text($('#newAge').val()); }); //3.点新增弹出来的模态框的退出,就清空姓名和年龄的值,然后隐藏模态框 $('#newExit').on('click',function () { $('#newName').val(''); $('#newAge').val(''); $('.cover,.modal-new').addClass('hide'); }); //------------------新增结束--------------------------------- //------------------编辑开始--------------------------------- //4.点编辑,要使用事件委托来绑定事件 //4.1弹出模态框:cover和modal-modify $tbodyEles.on('click','.modify',function () { $('.cover,.modal-modify').removeClass('hide'); //4.2把当前编辑的jQuery对象$modify保存到tbody标签里面,方便后面使用。 var $modify = $(this);//this是当前点击的DOM对象,$(this)是jQuery对象 $tbodyEles.data('currentModify',$modify); //4.3获取表格里面姓名和年龄的值,填写到表单的姓名和年龄里面去。 var name = $modify.parent().parent().children().eq(1).text(); var age = $modify.parent().parent().children().eq(2).text(); $('#modifyName').val(name); $('#modifyAge').val(age); }); //5.点编辑弹出来的表单modal-modify,修改了姓名和年龄之后,按确定, //触发事件:把姓名和年龄的值,赋予跟当前编辑同一行的姓名和年龄。 //$tbodyEles.data('currentModify')就是上面保存的当前编辑的jQuery对象$modify。 $('#modifySure').on('click',function () { var mName = $('#modifyName').val(); var mAge = $('#modifyAge').val(); $tbodyEles.data('currentModify').parent().parent().children().eq(1).text(mName); $tbodyEles.data('currentModify').parent().parent().children().eq(2).text(mAge); }); //6.点编辑弹出来的模态框的退出,就清空姓名和年龄的值,然后隐藏模态框 $('#modifyExit').on('click',function () { $('#modifyName').val(''); $('#modifyAge').val(''); $('.cover,.modal-modify').addClass('hide'); }); //------------------编辑结束--------------------------------- //------------------删除开始--------------------------------- //7.删除一行,要用事件委托 $tbodyEles.on('click','.cancel',function () { //7.1 先找到当前行的tr对象 var $TrEles = $(this).parent().parent(); //7.2 当前行的tr对象后面所有的tr的序号都要减一, // 当前行下面的所有对象$TrEles.nextAll()进行each循环, //$(this)就是$TrEles.nextAll(),而each会对$(this)的每一个对象循环。 $TrEles.nextAll().each(function () { //each先找到第一个文本,然后减一,接着再找下一个 var trNum = $(this).children().first().text(); $(this).children().first().text(trNum-1); }); //使用for循环也可以: // for(var i = 0 ; i<$TrEles.nextAll().length; i++){ // var trNum1 = $($TrEles.nextAll()[i]).children().first().text(); // $($TrEles.nextAll()[i]).children().first().text(trNum1-1); // } //7.3 删除当前行,要最后进行,如果放在前面删除了,就无法找到当前对象了。 $TrEles.remove(); }); //------------------删除结束--------------------------------- </script> </body> </html>