jQuery(4)

事件委托

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <ul>
 9     <li>11111</li>
10     <li>22222</li>
11     <li>33333</li>
12     <li>44444</li>
13     <li>55555</li>
14 </ul>
15 <br>
16 <button id="btn1">添加li</button>
17 <button id="btn2">解除事件委托</button>
18 <script type="text/javascript" src="js/jquery-1.10.1.js"></script>
19 <script type="text/javascript">
20     //   点击li  要给当前的li修改背景颜色
21 //    $('ul li').click(function () {   //只是有的li才有css变化,新添加的没有
22 //      $(this).css('background','pink');
23 //    });
24 
25 // 第一种事件委派
26 //  delegate方法  由祖先元素调用 传递三个参数(后代元素(是选择器字符窜),事件名称,回调函数)
27 //  在jq的事件委托中   会直接帮你在回调函数中 修改this的指向到当前的事件源
28    $('ul').delegate('li','click',function () {    //新增的li也有css变化
29        $(this).css('background','pink')
30    });
31 
32 // 第二种方式事件委派
33     // $('ul').on('click','li',function () {  //不常用
34     //     $(this).css('background','pink')
35     // });
36     
37     
38 //    点击btn1  创建新的li
39     $('#btn1').click(function () {
40       $('ul').append('<li>我是新增的li</li>')
41     })
42     
43     
44 //  点击btn2 解除事件委托
45     $('#btn2').click(function () {
46       $('ul').undelegate();
47     })
48 </script>
49 </body>
50 </html>

 

事件委托练习

  1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  2 <html>
  3 
  4 <head>
  5   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  6   <title>添加删除记录练习</title>
  7   <link rel="stylesheet" type="text/css" href="css.css"/>
  8 </head>
  9 <body>
 10 
 11 <table id="employeeTable">
 12   <tr>
 13     <th>Name</th>
 14     <th>Email</th>
 15     <th>Salary</th>
 16     <th>&nbsp;</th>
 17   </tr>
 18   <tr>
 19     <td>Tom</td>
 20     <td>tom@tom.com</td>
 21     <td>5000</td>
 22     <td><a href="deleteEmp?id=001">Delete</a></td>
 23   </tr>
 24   <tr>
 25     <td>Jerry</td>
 26     <td>jerry@sohu.com</td>
 27     <td>8000</td>
 28     <td><a href="deleteEmp?id=002">Delete</a></td>
 29   </tr>
 30   <tr>
 31     <td>Bob</td>
 32     <td>bob@tom.com</td>
 33     <td>10000</td>
 34     <td><a href="deleteEmp?id=003">Delete</a></td>
 35   </tr>
 36 
 37 </table>
 38 
 39 <div id="formDiv">
 40 
 41   <h4>添加新员工</h4>
 42 
 43   <table>
 44     <tr>
 45       <td class="word">name:</td>
 46       <td class="inp">
 47         <input type="text" name="empName" id="empName"/>
 48       </td>
 49     </tr>
 50     <tr>
 51       <td class="word">email:</td>
 52       <td class="inp">
 53         <input type="text" name="email" id="email"/>
 54       </td>
 55     </tr>
 56     <tr>
 57       <td class="word">salary:</td>
 58       <td class="inp">
 59         <input type="text" name="salary" id="salary"/>
 60       </td>
 61     </tr>
 62     <tr>
 63       <td colspan="2" align="center">
 64         <button id="addEmpButton" value="abc">
 65           Submit
 66         </button>
 67       </td>
 68     </tr>
 69   </table>
 70 </div>
 71 
 72 <script src="js/jquery-1.10.1.js" type="text/javascript" charset="utf-8"></script>
 73 <script type="text/javascript">
 74   /*
 75    功能说明:
 76    1. 点击'Submit', 根据输入的信息在表单中生成一行员工信息
 77    2. 点击Delete链接, 提示删除当前行信息, 点击确定后删除信息
 78    技术要点:
 79    1. DOM查询
 80    2. 绑定事件监听
 81    3. DOM增删改
 82    4. 取消事件的默认行为
 83    */
 84   $(function () {
 85 //    获取三个输入框
 86       var $empName = $('#empName');
 87       var $email = $('#email');
 88       var $salary = $('#salary');
 89 //  给提交按钮绑定单击事件    获取三个输入框的value   拼装节点
 90       $('#addEmpButton').click(function () {
 91 //          不带$的  是输入框的值   带$的 是元素     这个意义 是你自己人为赋予的
 92         var empName = $empName.val();
 93         var email = $email.val();
 94         var salary = $salary.val();
 95 //      任意一个输入框为空  都不能进入这个if里边
 96         if($.trim(empName) && $.trim(email) && $.trim(salary) ){  //输入框有数据
 97 //          拼装节点
 98 //        <tr>
 99 //            <td>Bob</td>
100 //            <td>bob@tom.com</td>
101 //            <td>10000</td>
102 //            <td><a href="deleteEmp?id=003">Delete</a></td>
103 //        </tr>
104 
105     //新增的tr,添加到#employeeTable tbody
106             $('<tr></tr>')
107                 .append('<td>'+empName+'</td>')
108                 .append('<td>'+email+'</td>')
109                 .append('<td>'+salary+'</td>')
110                 .append('<td><a href="deleteEmp?id=003">Delete</a></td>')
111                 .appendTo('#employeeTable tbody')
112                 
113         }else {
114 //            请不要提交空信息
115             alert('请不要输入空信息')
116         }
117 //        清空三个输入框
118           $empName.val('');
119           $email.val('');
120           $salary.val('');
121       });
122       
123 
124 
125 //    删除按钮
126     //事件委派方式delegate函数
127     $('#employeeTable').delegate('a','click', function(event){
128 //          阻止默认行为
129           event.preventDefault();
130 //        根据当前点击的a标签  找到它所对应的tr
131           var $tr = $(this).parent().parent();
132 //        获取当前这个tr中的name
133           var name = $tr.children(':first').html();
134 //        提示是否要删除这个name对应的信息   确定就删除  取消就不操作
135 //          confirm 确认框 有两个按钮 确认和取消  括号里边写提示信息
136 //          如果点击确认 则返回true  点击取消 则返回false
137 //          所以常和if 配合使用 把confirm  写在  if的判断条件中 如果点击确认即可执行if里边的逻辑
138           if(confirm('你确定要删除'+name+'的信息么?')){
139               $tr.remove();
140           }
141           
142           // return false;
143       }
144     );
145 
146   })
147 </script>
148 </body>
149 </html>

 

添加功能todolist练习

css

  1 /*base*/
  2 body {
  3   background: #fff;
  4 }
  5 
  6 .btn {
  7   display: inline-block;
  8   padding: 4px 12px;
  9   margin-bottom: 0;
 10   font-size: 14px;
 11   line-height: 20px;
 12   text-align: center;
 13   vertical-align: middle;
 14   cursor: pointer;
 15   box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
 16   border-radius: 4px;
 17 }
 18 
 19 .btn-danger {
 20   color: #fff;
 21   background-color: #da4f49;
 22   border: 1px solid #bd362f;
 23 }
 24 
 25 .btn-danger:hover {
 26   color: #fff;
 27   background-color: #bd362f;
 28 }
 29 
 30 .btn:focus {
 31   outline: none;
 32 }
 33 
 34 
 35 /*app*/
 36 .todo-container {
 37   width: 600px;
 38   margin: 0 auto;
 39 }
 40 .todo-container .todo-wrap {
 41   padding: 10px;
 42   border: 1px solid #ddd;
 43   border-radius: 5px;
 44 }
 45 
 46 /*header*/
 47 .todo-header input {
 48   width: 560px;
 49   height: 28px;
 50   font-size: 14px;
 51   border: 1px solid #ccc;
 52   border-radius: 4px;
 53   padding: 4px 7px;
 54 }
 55 
 56 .todo-header input:focus {
 57   outline: none;
 58   border-color: rgba(82, 168, 236, 0.8);
 59   box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
 60 }
 61 
 62 /*main*/
 63 .todo-main {
 64   margin-left: 0px;
 65   border: 1px solid #ddd;
 66   border-radius: 2px;
 67   padding: 0px;
 68 }
 69 
 70 .todo-empty {
 71   height: 40px;
 72   line-height: 40px;
 73   border: 1px solid #ddd;
 74   border-radius: 2px;
 75   padding-left: 5px;
 76   margin-top: 10px;
 77 }
 78 /*item*/
 79 li {
 80   list-style: none;
 81   height: 36px;
 82   line-height: 36px;
 83   padding: 0 5px;
 84   border-bottom: 1px solid #ddd;
 85 }
 86 
 87 li label {
 88   float: left;
 89   cursor: pointer;
 90 }
 91 
 92 li label li input {
 93   vertical-align: middle;
 94   margin-right: 6px;
 95   position: relative;
 96   top: -1px;
 97 }
 98 
 99 li button {
100   float: right;
101   display: none;
102   margin-top: 3px;
103 }
104 
105 li:before {
106   content: initial;
107 }
108 
109 li:last-child {
110   border-bottom: none;
111 }
112 
113 /*footer*/
114 .todo-footer {
115   height: 40px;
116   line-height: 40px;
117   padding-left: 6px;
118   margin-top: 5px;
119 }
120 
121 .todo-footer label {
122   display: inline-block;
123   margin-right: 20px;
124   cursor: pointer;
125 }
126 
127 .todo-footer label input {
128   position: relative;
129   top: -1px;
130   vertical-align: middle;
131   margin-right: 5px;
132 }
133 
134 .todo-footer button {
135   float: right;
136   margin-top: 5px;
137 }

 

js

  1 <!doctype html>
  2 <html lang="en">
  3     <head>
  4         <meta charset="utf-8">
  5         <title>未完成版</title>
  6         <link rel="stylesheet" href="index.css">
  7         <style>
  8             .todo-main li button {
  9                 display: none;
 10             }
 11         </style>
 12         <script type="text/javascript" src="js/jquery-1.10.1.js"></script>
 13         <script type="text/javascript">
 14             $(function () {
 15 //              模拟数据    实际的开发当中 根据后台接口来的
 16                 var dataJson = [{
 17                     'content':'唱歌'
 18                 },{
 19                     'content':'滑雪'
 20                 },{
 21                     'content':'遛狗'
 22                 }];
 23 //                获取ul元素
 24                 var $todoMain = $('.todo-main');
 25 //                获取全选按钮
 26                 var $checkAll = $('#checkAll');
 27                 
 28 //                数据绑定  1.页面初始化,跟新任务总数
 29                 function bindData(data) {
 30 //                    循环拼装节点
 31                     for (var i = 0; i < data.length; i++) {
 32                         $todoMain.append('<li class="todoItem" style="background: rgb(255, 255, 255);"><label>' +
 33                             '<input type="checkbox"><span>'+data[i].content+'</span></label>' +
 34                             '<button class="btn btn-danger" style="display: none;">删除</button></li>')
 35                     }
 36 //                    更新任务总数
 37                     allTodos();
 38                 }
 39                 bindData(dataJson);
 40                 
 41 //                更新任务总数,用的次数多,用函数封装
 42                 function allTodos() {
 43 //                  ul当中有多少个li 就有多少个任务 所以直接使用li的长度即可
 44                     $('#allTodos').html($todoMain.children('li').length)
 45                 }
 46                 
 47 //                更新已完成任务数,用的次数多,用函数封装
 48                 function allCompletedTodos() {
 49 //                  当前已经选中多少个复选框 就有多少个已完成任务
 50                     $('#allCompletedTodos').html($todoMain.find(':checkbox:checked').length)
 51                 }
 52                 
 53 //                复选框单击事件
 54                 $('.todoItem input').click(function () {
 55 //                  更新已完成任务数
 56                     allCompletedTodos();
 57 //                判断所有的任务都被选中了
 58                     $checkAll.prop('checked',$todoMain.find(':checkbox:not(:checked)').length === 0);
 59 //                    $checkAll.prop('checked',$('#allTodos').html() == $('#allCompletedTodos').html())
 60                 })
 61                 
 62 //                全选按钮
 63                 $checkAll.click(function () {
 64 //                  让所有的复选框 与全选按钮的checked状态保持一致
 65                     $todoMain.find(':checkbox').prop('checked',this.checked)
 66 //                    更新已完成任务数
 67                     allCompletedTodos();
 68                 });
 69                 
 70 // //                移入移出li
 71 //                 $('.todoItem').hover(function () {
 72 //                     //颜色背景变化
 73 //                     $(this).css('background','#ccc');
 74 //                     //删除按钮出现
 75 //                     $(this).children('button').show();
 76 //                 },function () {
 77 //                     $(this).css('background','#fff');
 78 //                     $(this).children('button').hide();
 79 //                 });
 80                 
 81                 // 给父元素绑定,事件委派 $('.todoItem')
 82                 // 第一个参数;选择器字符窜
 83                  $todoMain.delegate(('.todoItem'), 'mouseover' ,function(){
 84                      //移入事件,颜色变化,删除按钮出来
 85                      $(this).css('background','pink')
 86                      // $(this).children('.btn-danger').css('display','block')
 87                      $(this).children('.btn-danger').show()
 88                      
 89                  })
 90                  
 91                  $todoMain.delegate(('.todoItem'), 'mouseout' ,function(){
 92                       //移出事件,颜色消失,删除按钮消失
 93                       $(this).css('background','#fff')
 94                       $(this).children('.btn-danger').hide()                 
 95                                       
 96                  })
 97                 
 98 //                删除按钮
 99                 $('.todoItem>button').click(function () {
100 //                    点击删除按钮 删除的是当前这个按钮的父元素li
101                     $(this).parent().remove();
102 //                    更新任务总数
103                     allTodos();
104 //                    更新已完成任务数
105                     allCompletedTodos();
106 //                    如果删除某几个任务时 剩余的任务全都选中 全选的状态需要更新
107 //                    需要确定当前任务列表当中还存在任务  全选才可以被选中
108                     $checkAll.prop('checked',$todoMain.children('li').length!=0 &&
109                         $todoMain.find(':checkbox:not(:checked)').length === 0)
110                 })
111                 
112                 
113                 //                清除已完成任务按钮
114                                 $('#removeAllCompleted').click(function () {
115                                   $todoMain.find(':checkbox:checked').parent().parent().remove();
116                 //                  更新任务总数
117                                     allTodos();
118                 //                    更新已完成任务数
119                                     allCompletedTodos();
120                 //                    全选按钮只能是false状态
121                 //                    点击这个按钮之后  只有两种情况
122                 //                    1.删除所有选中的  留下一些 没有被选中的   这个时候全选不需要被选中
123                 //                    2.所有任务都被选中了 直接清空了所有任务  这个时候全选也不需要被选中
124                                     $checkAll.prop('checked',false);
125                                 })
126                                 
127                                 
128                 //                根据输入的值 创建新的任务
129                                 $('#newTodo').keyup(function (event) {
130                 //                  所有创建相关的逻辑 都要在按下回车的前提下执行
131                                     if(event.keyCode == 13){
132                 //                      判断输入的值 去除空格后是否为空
133                                         if($.trim($(this).val())){
134                 //                          输入有效
135                 //                            根据当前输入框的value  执行创建逻辑
136                                             var newData = [{
137                                                 'content':$(this).val()
138                                             }];
139                                             bindData(newData);
140                 //                        更新全选状态 因为新增的任务一定是未完成状态 所以需要更新 且一定为false
141                                             $checkAll.prop('checked',false);
142                                         }else{
143                 //                            输入无效
144                                             alert('请不要输入空信息')
145                                         }
146                 //                        清空输入框
147                                         $(this).val('');
148                                     }
149                                 })
150 
151             })
152         </script>
153     </head>
154 
155     <body>
156         <div id="root">
157             <div class="todo-container">
158                 <div class="todo-wrap">
159                     <div class="todo-header">
160                         <input id="newTodo" type="text" placeholder="请输入你的任务名称,按回车键确认" />
161                     </div>
162                     <ul class="todo-main">
163 
164                     </ul>
165                     <div class="todo-footer">
166                         <label>
167           <input id="checkAll" type="checkbox"/>
168         </label>
169                         <span>
170           已完成<span id="allCompletedTodos">0</span> / 全部<span id="allTodos">2</span>
171                         </span>
172                         <button id="removeAllCompleted" class="btn btn-danger">清除已完成任务</button>
173                     </div>
174                 </div>
175             </div>
176         </div>
177     </body>
178 
179 </html>

 

插件扩展

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>25_扩展插件</title>
 6     <style type="text/css">
 7         * {
 8             margin: 0px;
 9         }
10 
11         .div1 {
12             position: absolute;
13             width: 100px;
14             height: 100px;
15             top: 50px;
16             left: 10px;
17             background: red;
18         }
19     </style>
20 </head>
21 <body>
22 <input type="checkbox" name="items" value="足球"/>足球
23 <input type="checkbox" name="items" value="篮球"/>篮球
24 <input type="checkbox" name="items" value="羽毛球"/>羽毛球
25 <input type="checkbox" name="items" value="乒乓球"/>乒乓球
26 <br/>
27 <input type="button" id="btn1" value="全 选"/>
28 <input type="button" id="btn2" value="全不选"/>
29 <input type="button" id="btn3" value="反选"/>
30 
31 <!--
32 1. 扩展jQuery的工具方法
33   $.extend(object)
34 2. 扩展jQuery对象的方法
35   $.fn.extend(object)
36 -->
37 <script type="text/javascript" src="js/jquery-1.10.1.js"></script>
38 <script type="text/javascript" src="js/my_jQuery_plugin.js"></script>
39 <script type="text/javascript">
40     console.log($.min(9,11));
41     console.log($.max(5,12));
42     var str = '   my atguigu   ';
43     console.log('---'+$.leftTrim(str)+'---');
44     console.log('---'+$.rightTrim(str)+'---');
45 
46 
47     $('#btn1').click(function () {
48       $(':checkbox').checkAll(); 
49     });
50     $('#btn2').click(function () {
51         $(':checkbox').unCheckAll();
52     });
53     $('#btn3').click(function () {
54         $(':checkbox').reverseCheck();
55     })
56 </script>
57 </body>
58 </html>
<script type="text/javascript" src="js/my_jQuery_plugin.js"></script>
 1 /*
 2  扩展jQuery的工具方法 : $.extend(object)
 3    min(a, b) : 返回较小的值
 4    max(c, d) : 返回较大的值
 5    leftTrim() : 去掉字符串左边的空格
 6    rightTrim() : 去掉字符串右边的空格
 7  */
 8 
 9 //正则
10 /*
11  ^   匹配字符串开始
12  \s  匹配空格
13  +   匹配一次或者多次
14  $   匹配字符串的末尾
15  */
16 $.extend({
17     min:function (a,b) {
18       return a > b ? b : a;
19     },
20     max:function (a,b) {
21       return a > b ? a : b;
22     },
23     leftTrim:function (str) {
24       return str.replace(/^\s+/,'');
25     },
26     rightTrim:function (str) {
27       return str.replace(/\s+$/,'')
28     }
29 });
30 
31 
32 
33 /*  2. 给jQuery对象 添加3个功能方法:
34  * checkAll() : 全选
35  * unCheckAll() : 全不选
36  * reverseCheck() : 反选
37  * */
38  
39  // 2. 扩展jQuery对象的方法
40  //   $.fn.extend(object)
41  
42  
43 $.fn.extend({
44     checkAll:function () {
45       this.prop('checked',true); // this就是$(':checkbox')
46     },
47     unCheckAll:function () {
48       this.prop('checked',false)
49     },
50     reverseCheck:function() {
51       this.each(function () {  //this就是$(':checkbox')
52         this.checked = !this.checked;  //this就是遍历的每个dom元素
53       })
54     }
55 });

 

 
posted @ 2020-05-24 11:23  全情海洋  阅读(277)  评论(0编辑  收藏  举报