jQuery事件冒泡:
click mouseenter 等事件没有绑定 也会触发,只是触发后没有任何结果

子元素触发事件后,会把触发事件传递给父元素,那么父元素也会被触发。
不管有没有绑定事件,都会触发事件,只是没有结果,事件冒泡传递还是会发生

系统自动产生的event事件对象
function传的第一个参数就是event事件对象



1 event.stopPropagation(); // 阻止事件冒泡
2 event.preventDefault() // 阻止默认行为 比如submit阻止表单提交
3 
4 // 上面两个阻止 可以合并写成
5 return false;



事件委托:

事件委托就是利用冒泡的原理,把事件加到父级上,通过判断事件来源的子集,执行相应的操作,事件委托首先可以极大减少事件绑定次数,提高性能;其次可以让新加入的子元素也可以拥有相同的操作。

基本实现:



1 $(function(){
 2     var $li = $('.list li');
 3     var $list = $('.list');
 4 
 5     // 多次绑定,性能堪忧
 6     // $li.click(function(){
 7     //     $(this).css({'background':'red'});
 8     // })
 9     
10     // 事件委托方式 delegate(发生事件的元素, 事件属性, 匿名函数)
11     $list.delegate('li','click',function(){
12         $(this).css({'background':'red'});
13     })
14 
15 })



上述代码不能很好的体现事件委托的优势,下面引入Dom操作 综合体现事件委托的优势。

 

Dom操作:

Dom操作也叫做元素节点操作,它指的是改变html的标签结构,它有两种情况:
1、移动现有标签的位置
2、将新创建的标签插入到现有的标签中

 



1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>Document</title>
 8     <script src="js/jquery-1.12.4.min.js"></script>
 9     <script>
10         $(function(){
11             var $div01 = $('#div01');
12             var $p01 = $('#p01');
13             var $h01 = $('#h01');
14             var $p02 = $('#p02');
15            
16             // 当前元素里面的后面要放另外一个元素
17             // $div01.append($p01);
18 
19             // 当前元素要放到另外一个元素的里面的后面
20             $p01.appendTo($div01);
21 
22             // 当前元素里面的前面要放另外一个元素
23             // $div01.prepend($h01);
24 
25             // 当前元素要放到另外一个元素里面的前面
26             $h01.prependTo($div01);
27 
28 
29             // 当前元素外面的后面要放另外一个元素
30             // $div01.after($p02);
31 
32             // 当前元素要放到另外一个元素的外面的后面
33             $p02.insertAfter($div01);
34 
35             // 创建一个空div标签
36             var $newdiv01 = $('<div>');
37 
38             // 创建一个有内容的div标签
39             var $newdiv02 = $('<div>新创建的第二个div</div>');
40 
41 
42             // 当前元素外面的前面要放另外一个元素
43             $div01.before( $newdiv01 );
44 
45             // 当前元素要放到另外一个元素的外面的前面
46             $newdiv02.insertBefore($div01);
47 
48             // 删除标签
49             $newdiv01.remove();
50 
51             $p01.remove();
52 
53         })
54     
55     
56     </script>
57 </head>
58 <body>
59     <p id="p01">这是div01外面的p标签</p>
60     <h2 id="h01">这是div01外面的h2标题</h2>
61     <p id="p02">这是div01外面的第二个p标签</p>
62     <div id="div01">
63         <h3>这是div01里面的h3</h3>
64         <p>这是div01里面的p标签</p>      
65     </div>
66 </body>
67 </html>



下面这个例子能体现事件委托的优势



1 $(function(){
 2     var $txt = $('#txt1');
 3     var $btn = $('#btn1');
 4     var $list = $('#list');
 5 
 6     // 增加计划
 7     $btn.click(function(){
 8         var sVal = $txt.val();
 9 
10         // 清空输入框
11         $txt.val('');
12 
13         // 判断输入框是否为空
14         if(sVal==''){
15             alert('请输入内容!');
16             return;
17         }
18         
19         // 创建一个包含计划内容的li标签
20         var $li = $('<li><span>'+ sVal +'</span><a href="javascript:;" class="up"> ↑ </a><a href="javascript:;" class="down"> ↓ </a><a href="javascript:;" class="del">删除</a></li>');
21         $li.appendTo($list);
22 
23         /*
24         var $del = $li.find('.del');
25         $del.click(function(){
26             $(this).parent().remove();
27         });
28         */
29     })
30 
31 
32     // 删除功能:
33     /*
34     var $del = $('.del');            
35     $del.click(function(){
36         $(this).parent().remove();
37     })
38     */
39 
40     // 事件委托 
41     $list.delegate('a','click',function(){
42         if($(this).hasClass('del')){
43             $(this).parent().remove();
44         }else if($(this).hasClass('up')){
45             if($(this).parent().prev().length==0){
46                 alert('到顶了已经');
47                 return false;
48             }
49             $(this).parent().insertBefore($(this).parent().prev());
50         }else{
51             if($(this).parent().next().length==0){
52                 alert('到底了已经');
53                 return false;
54             }
55             $(this).parent().insertAfter($(this).parent().next());
56         }
57     })
58 })