事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流

一、事件冒泡定义

事件冒泡是指在一个对象触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,甚至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层级的最顶层,即document对象(有些浏览器是window).。

二、事件冒泡的作用

事件冒泡允许多个操作被集中处理(把事件处理器添加到一个父级元素上,避免把事件处理器添加到多个子级元素上),它还可以让你在对象层的不同级别捕获事件。

三、阻止事件冒泡

事件冒泡机制有时候是不需要的,需要阻止掉,通过event.stopPropagation()来阻止

四、阻止默认行为

如:阻止右键菜单

五、合并阻止操作

实际开发中,一般把阻止冒泡和阻止默认行为合并起来写,合并写法如下:

六、事件委托

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

1、一般绑定事件的写法:

2、事件委托的写法:(实际开发中,如果是对大量子元素进行操作时,应该用事件委托的方式,提高性能)

七、取消事件委托

用法:$("委托对象").undelegate()

八、jQuery元素节点操作

1、创建节点

2、插入节点

  a、append()和appendTo()   在现存元素的内部,从后面插入元素

  

  输出结果为:

  

  b、prepend()和prependTo()   在现存元素的内部,从前面插入元素

  

  输出结果:

  

  c、after()和insertAfter()  在现存元素的外部,从后面插入元素

  

  输出结果:

  

  d、before()和insertBefore() 在现存元素的外部,从前面插入元素

  

  输出结果:

  

3、删除节点

  $(selector).remove();

  

4、to  do  list(计划列表)实例

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <link rel="stylesheet" href="../css/reset.css">
  6     <style>
  7        .con{
  8            width:360px;
  9            margin:30px auto;
 10        }
 11        .con > h3{
 12            margin-bottom:15px;
 13        }
 14        .con input{
 15            width:290px;
 16            height:30px;
 17        }
 18        .con button{
 19            width:60px;
 20            height:34px;
 21            border:0;
 22        }
 23         .con ul li{
 24             display: flex;
 25             margin-top:15px;
 26             border-bottom:1px solid #ccc;
 27             justify-content: space-between;
 28         }
 29        .con li p{
 30            /*清除a元素之间的间隙*/
 31            font-size:0;
 32        }
 33         .con li p a{
 34             color:#1b5fdd;
 35             font-size:16px;
 36             margin-left:10px;
 37         }
 38         /*弹框样式*/
 39         .pop_con{
 40             position:fixed;
 41             top:0;
 42             right:0;
 43             bottom:0;
 44             left:0;
 45             background:#000;
 46             display: none;
 47         }
 48         .pop{
 49             width:400px;
 50             height:220px;
 51             position:absolute;
 52             left:50%;
 53             margin-left:-200px;
 54             top:50%;
 55             margin-top:-150px;
 56             background:#fff;
 57         }
 58         .pop .pop_title{
 59             padding:15px;
 60             display: flex;
 61             justify-content: space-between;
 62         }
 63         .pop .pop_title a{
 64             width:36px;
 65             height:36px;
 66             line-height:36px;
 67             border-radius:50%;
 68             background:#c7254e;
 69             color:#fff;
 70             text-align: center;
 71             position:absolute;
 72             top:-18px;
 73             right:-18px;
 74             transition: all 1s ease;
 75         }
 76         .pop_title h3{
 77             letter-spacing: 2px;
 78             font-weight: normal;
 79         }
 80         .pop_title a:hover{
 81             transform: rotate(360deg);
 82         }
 83         .pop_message{
 84             height:110px;
 85             line-height:110px;
 86             text-align: center;
 87         }
 88        .pop_confirm{
 89            height:36px;
 90            text-align: center;
 91        }
 92         .pop_confirm button{
 93             height:36px;
 94             line-height: 36px;
 95             padding:0 15px;
 96             background: #c7254e;
 97             border:none;
 98             color:#fff;
 99             outline: none;
100         }
101     </style>
102     <script src="../js/jquery-1.12.4.min.js"></script>
103     <script>
104         $(function(){
105             //声明变量
106             var $input = $("#input");
107             $(".pop").click(function(){
108                 return false;
109             });
110             $(".pop_confirm").click(function(){
111                 $(".pop_con").fadeOut();
112             });
113             $(".close").click(function(){
114                 $(".pop_con").fadeOut();
115             });
116             $(".pop_con").click(function(){
117                 $(this).fadeOut();
118             });
119             //点击增加按钮,新增元素
120             $("#add").click(function(){
121                var $inputVal = $input.val();
122                 //如果输入值为空,出现弹框提示
123                 if($inputVal == ""){
124                     $(".pop_con").fadeIn();
125                     return false
126                 }
127                 $input.val("");
128                 var $li = $("<li><h3>"+$inputVal+"</h3><p><a class=‘delete‘ href=‘javascript:void(0);‘>删除</a><a class=‘prev‘ href=‘javascript:void(0);‘>上移</a><a class=‘next‘ href=‘javascript:void(0);‘>下移</a></p></li>");
129                 $("ul").append($li);
130             });
131             //使用事件委托写在一起,提高性能
132             $("ul").delegate("li a","click",function(){
133                 //首先判断点击的是哪个a
134                 if($(this).attr("class") == "prev"){
135                     //判断是否存在该元素
136                     if($(this).closest("li").prev().length ==0){
137                         $(".pop_message").html("已到顶部!");
138                         $(".pop_con").fadeIn();
139                         return false
140                     }
141                     $(this).closest("li").prev().before($(this).closest("li"));
142                 }else if($(this).attr("class") == "next"){
143                     if($(this).closest("li").next().length ==0){
144                         $(".pop_message").html("已到底部!");
145                         $(".pop_con").fadeIn();
146                     }
147                     $(this).closest("li").next().after($(this).closest("li"));
148                 }else{
149                     $(this).closest("li").remove();
150                 }
151             })
152         })
153     </script>
154 </head>
155 <body>
156     <div class="con">
157         <h3>To  do  list</h3>
158         <input type="text" id="input">
159         <button id="add">增加</button>
160         <ul class="ul">
161             <li>
162                 <h3>学习html</h3>
163                 <p>
164                     <a href="javascript:void(0);" class="delete">删除</a>
165                     <a href="javascript:void(0);" class="prev">上移</a>
166                     <a href="javascript:void(0);" class="next">下移</a>
167                 </p>
168             </li>
169             <li>
170                 <h3>学习css</h3>
171                 <p>
172                     <a href="javascript:void(0);" class="delete">删除</a>
173                     <a href="javascript:void(0);" class="prev">上移</a>
174                     <a href="javascript:void(0);" class="next">下移</a>
175                 </p>
176             </li>
177             <li>
178                 <h3>学习ps</h3>
179                 <p>
180                     <a href="javascript:void(0);" class="delete">删除</a>
181                     <a href="javascript:void(0);" class="prev">上移</a>
182                     <a href="javascript:void(0);" class="next">下移</a>
183                 </p>
184             </li>
185         </ul>
186     </div>
187     <div class="pop_con">
188         <div class="pop">
189             <div class="pop_title">
190                 <h3>提示信息</h3>
191                 <a href="javascript:void(0);" class="close">X</a>
192             </div>
193             <div class="pop_message">输入框不能为空</div>
194             <div class="pop_confirm">
195                 <button>朕知道了</button>
196             </div>
197         </div>
198     </div>
199 </body>
200 </html>

to do list

九、滚轮事件与函数节流

1、jquery.mousewheel插件使用

jquery中没有滚轮事件,原生js中的鼠标滚轮事件不兼容,可以使用jquery的滚轮事件插件jquery.nousewheel.js。

2、函数节流

javascript中有些事件的触发频率非常高,比如onresize事件(jq中是resize),onmousemove事件(jq中是mousemove)以及上面说的鼠标滚轮事件,在短时间内多次触发执行绑定的函数可以巧妙的使用定时器来减少触发的次数,实现函数节流。

3、整屏滚动实例

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>整屏滚动</title>
  6     <link rel="stylesheet" href="../css/reset.css">
  7     <style>
  8         .page_con{
  9             width:100%;
 10             /*必须是固定定位,否则会有问题*/
 11             position:fixed;
 12             top:0;
 13             left:0;
 14             overflow: hidden;
 15         }
 16         .page{
 17             position:relative;
 18         }
 19         .page .main_con{
 20             width:900px;
 21             height:400px;
 22             position:absolute;
 23             left:50%;
 24             top:50%;
 25             margin-top:-200px;
 26             margin-left:-450px;
 27         }
 28         .page .main_con .left_img{
 29             width:363px;
 30             height:400px;
 31         }
 32         .page .main_con .left_img,.page .main_con .right_img{
 33             opacity: 0;
 34             position: relative;
 35             filter:alpha(opacity = 0);
 36             transition:all 1s ease 300ms;
 37         }
 38         .page .main_con .right_info{
 39             width:500px;
 40             height:300px;
 41         }
 42         .page .main_con .right_info,.page .main_con .left_info{
 43             font-size:20px;
 44             line-height:50px;
 45             color:#666;
 46             text-indent:2em;
 47             text-align:justify;
 48             position:relative;
 49             opacity:0;
 50             filter:alpha(opacity=0);
 51             transition:all 1000ms ease 300ms;
 52         }
 53         .main_con .right_img{
 54             width:522px;
 55             height:400px;
 56             top:-50px;
 57         }
 58
 59         .main_con .left_info{
 60             width:350px;
 61             height:300px;
 62             bottom:-50px;
 63         }
 64         .main_con .left_img,.main_con .left_info{
 65             left:-50px;
 66         }
 67         .main_con .right_img,.main_con .right_info{
 68             right:-50px;
 69         }
 70         .main_con .center_img{
 71             opacity: 0;
 72             filter:alpha(opacity = 0);
 73             text-align: center;
 74             transition: all 1s ease 300ms;
 75         }
 76         .moving .main_con .left_img,.moving .main_con .left_info,.moving .main_con .center_img{
 77             left:0;
 78             opacity: 1;
 79             filter:alpha(opacity = 100);
 80         }
 81         .moving .main_con .center_img{
 82             transform: scale(0.8);
 83         }
 84         .moving .main_con .right_info,.moving .main_con .right_img{
 85             margin-top:50px;
 86             right:0;
 87             opacity: 1;
 88             filter:alpha(opacity = 100);
 89         }
 90         .moving .main_con .right_img{
 91             /*top:25px;*/
 92         }
 93         .page1{
 94             background:orange;
 95         }
 96
 97         .page2{
 98             background:lightgreen;
 99         }
100         .page3{
101             background:cyan;
102         }
103         .page4{
104             background:pink;
105         }
106         .page5{
107             background:lightblue;
108         }
109         .points{
110             width:16px;
111             height:176px;
112             position:fixed;
113             top:50%;
114             right:20px;
115             margin-top:-88px;
116         }
117         .points li{
118             width:16px;
119             height:16px;
120             line-height:16px;
121             margin-top:15px;
122             border:1px solid #666;
123             border-radius:50%;
124         }
125         .points li:hover,.points li.active{
126             width:6px;
127             height:6px;
128             cursor: pointer;
129             border:6px solid #fff70c;
130         }
131     </style>
132     <script src="../js/jquery-1.12.4.min.js"></script>
133     <script src="../js/jquery.mousewheel.min.js"></script>
134     <script>
135         $(function(){
136             $(".page1").addClass("moving");
137             var page = $(".page");
138             var len = page.length;
139             var currentPage = 0;
140             var timer = null;
141             //获取显示区域的高度
142             var $h = $(window).height();
143             page.css({height:$h});
144             $(window).mousewheel(function(event,dat){
145                 //向下滑dat为-1,向上滑dat为1
146                 //清除前面开的定时器,实现函数节流
147                 clearTimeout(timer);
148                 timer = setTimeout(function(){
149                     if(dat == -1){
150                         currentPage++;
151                         if(currentPage>len-1){
152                             //如果大于4的话,就不往下滑
153                             currentPage=len-1;
154                         }
155                     }else{
156                         currentPage--;
157                         //判断当前所在页是否小于0,如果小于就不往上滑。
158                         if(currentPage<0){
159                             currentPage=0;
160                         }
161                     }
162                     $(".page").eq(currentPage).addClass("moving").siblings().removeClass("moving");
163                     $("ul li").eq(currentPage).addClass("active").siblings().removeClass("active");
164                     $(".page_con").animate({top:-$h*currentPage},300);
165                 },200);
166
167             });
168             $(".points").delegate("li","click",function (){
169                 $(".page").eq($(this).index()).addClass("moving").siblings().removeClass("moving");
170                 $(this).addClass("active").siblings().removeClass("active");
171                 currentPage = $(this).index()+1;
172                 //首先判断下点击的元素在当前选中的元素的上面还是下面,如果是在上面的话,top值为正值,否则为负值。
173                 if($(this).index()<$(".active").index()){
174                     $(".page_con").animate({top:$h*$(this).index()});
175                 }else{
176                     $(".page_con").animate({top:-$h*$(this).index()});
177                 }
178             })
179         })
180     </script>
181 </head>
182 <body>
183 <div class="page_con">
184     <div class="page page1">
185         <div class="main_con clearfix">
186             <div class="page_img float_left left_img">
187                 <img src="../images/001.png" alt="">
188             </div>
189             <div class="page_content float_right right_info">
190                 Web前端开发是从网页制作演变而来的,名称上有很明显的时代特征。在互联网的演化进程中,网页制作是Web1.0时代的产物,那是网站的主要内容都是静态的,用户使用网站的行为也以浏览为主。
191             </div>
192         </div>
193     </div>
194     <div class="page page2">
195         <div class="main_con clearfix">
196             <div class="page_content float_left left_info">
197                 2005年以后,互联网进入web2.0时代,各种类似桌面软件的Web应用大量涌现,网站的前端有此发生了翻天覆地的变化。网页不再只是承载单一的文字和图片,各种富媒体让网页的内容更加生动,网页上的软件化的交互形式为用户提供了更好的使用体验,这些都是基于前端技术实现的。
198             </div>
199             <div class="page_img float_right right_img">
200                 <img src="../images/002.png" alt="">
201             </div>
202         </div>
203     </div>
204     <div class="page page3">
205         <div class="main_con clearfix">
206             <div class="page_img float_left left_img">
207                 <img src="../images/004.png" alt="">
208             </div>
209             <div class="page_content float_right right_info">
210                 Web前端开发是从网页制作演变而来的,名称上有很明显的时代特征。在互联网的演化进程中,网页制作是Web1.0时代的产物,那是网站的主要内容都是静态的,用户使用网站的行为也以浏览为主。
211             </div>
212         </div>
213     </div>
214     <div class="page page4">
215         <div class="main_con clearfix">
216             <div class="page_content float_left left_info">
217                 2005年以后,互联网进入web2.0时代,各种类似桌面软件的Web应用大量涌现,网站的前端有此发生了翻天覆地的变化。网页不再只是承载单一的文字和图片,各种富媒体让网页的内容更加生动,网页上的软件化的交互形式为用户提供了更好的使用体验,这些都是基于前端技术实现的。
218             </div>
219             <div class="page_img float_right right_img">
220                 <img src="../images/003.png" alt="">
221             </div>
222         </div>
223     </div>
224     <div class="page page5">
225         <div class="main_con">
226             <div class="page_img center_img">
227                 <img src="../images/005.png" alt="">
228             </div>
229         </div>
230     </div>
231 </div>
232 <ul class="points">
233     <li class="active"></li>
234     <li></li>
235     <li></li>
236     <li></li>
237     <li></li>
238 </ul>
239 </body>
240 </html>

整屏滚动

时间: 2024-10-29 19:09:39

事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流的相关文章

jquery元素节点操作

jquery元素节点操作 创建节点 var $div = $('<div>'); var $div2 = $('<div>这是一个div元素</div>'); 插入节点 1.append()和appendTo():在现存元素的内部,从后面插入元素 var $span = $('<span>这是一个span元素</span>'); $('#div1').append($span); ...... <div id="div1"

jquery中动态新增的元素节点无法触发事件解决办法

在使用jquery中动态新增的元素节点时会发现添加的事件是无法触发的,我们下面就为各位来详细的介绍此问题的解决办法. 比如做一个ajax读取留言列表的时候,每条留言后面有个回复按钮,class为“reply”,如果你用的是$(".reply").click(function(){ //do something... }),想必后面通过ajax加载进来的列表中的回复按钮,点击事件会失效. 其实最简单的方法就是直接在标签中写onclick="",但是这样写其实是有点lo

解决jquery中动态新增的元素节点无法触发事件的问题有两种解决方法

解决jquery中动态新增的元素节点无法触发事件的问题有两种解决方法,如下: 为了达到更好的演示效果,假设在某个页面的body下有以下结构的代码: ? 1 2 3 4 5 6 7 8 9 10 11 <p id="pLabel">新加一条</p> <ul id="ulLabel">  <li class="liLabel">aaa1</li>  <li class="li

js阻止浏览器的默认行为以及停止事件冒泡(用JQuery实现回车提交,兼容IE、FF浏览器) 转

1.阻止浏览器的默认行为 function stopDefault(e) { //如果提供了事件对象,则这是一个非IE浏览器 if(e && e.preventDefault) { //阻止默认浏览器动作(W3C) e.preventDefault(); } else { //IE中阻止函数器默认动作的方式 window.event.returnValue = false; } return false; } 2.停止事件冒泡 function stopBubble(e) { //如果提供

【JavaScript】事件冒泡及使用jQuery阻止

(1)什么是事件起泡 首先你要明白一点,当一个事件发生的时候,该事件总是有一个事件源,即引发这个事件的对象,一个事件不能凭空产生,这就是事件的发生. 当事件发生后,这个事件就要开始传播.为什么要传播呢?因为事件源本身并没有处理事件的能力.例如我们点击一个按钮时,就会产生一个click事件,但这个按钮本身不能处理这个事件(废话),事件必须从这个按钮传播出去,从而到达能够处理这个事件的代码中(例如我们给按钮的onclick属性赋一个函数的名字,就是让这个函数去处理该按钮的click事件). 当事件在

jQuery DOM 节点操作

DOM 中有一个非常重要的功能,就是节点模型,也就是 DOM 中的“M”.页面中的元素结构就是通过这种节点模型来互相对应着的,我们只需要通过这些节点关系,可以创建.插入.替换.克隆.删除等等一些列的元素操作. 一.创建节点 为了使页面更加智能化,有时我们想动态的在 html 结构页面添加一个元素标签,那么 在插入之前首先要做的动作就是:创建节点. $('div').append('<strong>节点</strong>'); //向 div 内部插入 strong 节点 $('di

前端的事件冒泡(例如点击一次onclick事件执行两次)解决办法

问题概要: 当我运用antd 中 radio组件的时候发现radio组件是有bug的 就是你不能给他赋予id 和 value,同时也绑定不上onclick等事件.举个例子: 可以看到 你就算赋予了id 和value 前端页面渲染也是不正常的 value无论赋成什么 结果都是on但是我还需要对他进行一些操作需要绑定他的onclick事件 所以我得解决办法就是在radio标签外套了一层div 绑定了id属性,同时将onclick事件绑定在这层div上.当我们触发它时,通过jQuery的子选择器找到内

jQuery DOM节点操作

一.创建节点 var box = $('<div id =box>节点</div>');  //创建一个节点 $('body').appended(box); //将节点插入<body>元素内部 二.插入节点 内部插入节点方法 append(content)     向指定元素后面插入节点content append(function (index,hml) {}) 使用匿名函数向指定元素后面插入节点content(html是原节点) appendTo(content)

jQuery DOM节点操作 - 父节点、子节点、兄弟节点

------------------------------------------------------------------- 源文地址: http://www.cnblogs.com/yunlei0821/p/7577400.html ,转载请务必保留此出处. 子(/孙)节点: .children([selector]). 获得匹配元素集合中每个元素的所有直接子元素(选择器可选). 实例: <div> <a href="#"><span>w