vue学习:事件传递(冒泡和捕获),事件委托,jquery中的事件委托,$event 获取元素,vue事件修饰符

事件传递 ----冒泡和捕获

DOM事件标准定义了两种事件流,这两种事件流分别是捕获和冒泡。

和许多Web技 术一样,在它们成为标准之前,Netscape和微软各自不同地实现了它们。Netscape选择实现了捕获事件流,微软则实现了冒泡事件流。幸运的 是,W3C决定组合使用这两种方法,并且大多数新浏览器都遵循这两种事件流方式。


默认情况下,事件使用冒泡事件流,不使用捕获事件流。然而,在Firefox和Safari里,你可以显式的指定使用捕获事件流,方法是在注册事件时传入useCapture参数,将这个参数设为true。

 

冒泡事件流:

在冒泡过程中的任何时候都可以终止事件的冒泡,在遵从W3C标准的浏览器里可以通 过调用事件对象上的stopPropagation()方法,在Internet Explorer里可以通过设置事件对象的cancelBubble属性为true。如果不停止事件的传播,事件将一直通过DOM冒泡直至到达文档根。即从被点击的元素到此元素的祖先元素直至根元素,从下到上

 

捕获事件流:

事件的处理将从DOM层次的根开始,而不是从触发事件的目标元素开始,事件被从目标元素的所有祖先元素依次往下传递。在这个过程中,事件会被从文档 根到事件目标元素之间各个继承派生的元素所捕获,如果事件监听器在被注册时设置了useCapture属性为true,那么它们可以被分派给这期间的任何 元素以对事件做出处理;否则,事件会被接着传递给派生元素路径上的下一元素,直至目标元素。事件到达目标元素后,它会接着通过DOM节点再进行冒泡。即根元素到被点击的元素,从上到下

 

事件代理(委托)

说明:事件委托就是事件目标自身不处理事件,而是把处理任务委托给其父元素或者祖先元素,甚至根元素(document)。

原理:事件委托是利用事件的冒泡原理来实现的 。事件监听器会分析从子元素冒泡上来的事件,找到是哪个子元素的事件。

使用原因:

  1. 绑定事件太多,浏览器占用内存变大,严重影响性能;
  2. Ajax出现,局部刷新盛行,每次加载完,都要重新绑定事件;
  3. 部分浏览器移除元素时,绑定的事件没有被及时移除,导致内存泄漏,严重影响性能;
  4. Ajax中重复绑定,导致代码耦合性过大,影响后期维护

 

如下demo 01,列表在给新增或删除的列表项时,绑定或删除相应事件监听的工作枯燥并繁杂,而使用事件委托,将监听器安装在列表项的父元素上后,当子元素的事件冒泡到父ul元素时,只需要检查事件对象的target属性,捕获真正被点击的节点元素的引用。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>测试</title>
</head>
<body><div><ul id="parent-list"><li id="post-1">Item 1</li><li id="post-2">Item 2</li><li id="post-3">Item 3</li><li id="post-4">Item 4</li><li id="post-5">Item 5</li><li id="post-6">Item 6</li></ul></div><script>//找到父元素,添加监听器。。。document.getElementById('parent-list').addEventListener('click', function (e) {//e.target是被点击的元素//如果被点击的是li元素if(e.target && e.target.nodeName =="LI") { //注意这里的nodeName标签名要用大写e.target.style.color="red";   //执行操作,,,console.log('List item', e.target.id, "was clicked");}})</script></body>
</html>

 

demo02 当需要给所有的a标签绑定click事件时使用事件委托,而部分a标签又包含图片img、span元素,用户希望点击span或img标签也能触发相应的click事件。这时就需要:从触发click事件的元素开始,逐级向上查找,直到找到a标签为止。代码如下

document.addEventListener("click", function(e) {var node = e.target;while (node.parentNode.nodeName != "BODY") {if (node.nodeName == "A") {console.log("a");break;}node = node.parentNode;}
}, false);

 

 

 

JQuery中的事件委托

   jQuery中的事件委托方式比较丰富,如下

1、用on方法,代码如下:

$(function(){$("#lists").on("click","li",function(event){var target = $(event.target);target.css("background-color","red");})
})

 

2.用delegate()方法,代码如下:

$(function(){$("#lists").delegate("li","click",function(event){var target = $(event.target);target.css("background-color","red");})
})

 

on()方法和delegate()方法对于事件委托的写法很像。并且执行事件委托的时候只有子元素(本文中的li)会触发事件,而代为执行的父元素(本文中为ul)不会触发事件,所以我们不需要盘判断触发事件的元素节点名,这一点明显优于原生的JavaScript。

 

3.用bind()方法,代码如下:

$(function(){$("#lists").bind("click","li",function(event){var target = $(event.target);if(target.prop("nodeName")=="LI"){target.css("background-color","red");}})
})

bind()方法同原生的JavaScript实现方法一样,当父元素代子元素执行事件时,父元素也会触发事件,所以我们需要判断一下触发事件的元素名。此外,用bind()方法给元素绑定事件的时候要注意,它只能给已经存在DOM元素添加事件,不能给未来存在DOM

元素添加添加事件。如果要频繁地添加DOM元素,并且给新添加的DOM元素绑定事件的话,用live(),delegate(),on()等方法。鉴于jQuery从1.7之后就不推荐live()和delegate()方法了,所以大家还是使用on()方法吧

 

 

 

 

vue中使用$event

vue中直接套用上述代码会报错(无法找到target),使用$event 传入到vue组件方法中,如下

<template><div class="page"><div><ul id="parent-list"  @click="checkClick($event)"><li id="post-1">Item 1</li><li id="post-2">Item 2</li></ul></div></div>
</template><script>export default {name: 'Login',methods: {checkClick:function(e){if(e.target && e.target.nodeName == 'LI') {//执行操作,,,console.log('List item', e.target.id, "was clicked")}}}}
</script>

 

vue中使用$event 获取当前元素、父子兄弟元素

<tempalte><button @click = “getEvent($event)”>点击</button>
</template><script>export default {methods:{getEvent(e) {console.log(e)// e.target 是你当前点击的元素// e.currentTarget 是你绑定事件的元素#获得点击元素的前一个元素e.currentTarget.previousElementSibling.innerHTML#获得点击元素的第一个子元素e.currentTarget.firstElementChild# 获得点击元素的下一个元素e.currentTarget.nextElementSibling# 获得点击元素中id为string的元素e.currentTarget.getElementById("string")# 获得点击元素的string属性e.currentTarget.getAttributeNode('string')# 获得点击元素的父级元素e.currentTarget.parentElement# 获得点击元素的前一个元素的第一个子元素的HTML值e.currentTarget.previousElementSibling.firstElementChild.innerHTML},}}
</script>


 

 

vue事件处理

如果需要在内联语句处理器中访问原生DOM事件。可以使用特殊变量$event,把它传入到methods中的方法中

     在Vue中,事件修饰符处理了许多DOM事件的细节,让我们不再需要花大量的时间去处理这些烦恼的事情,而能有更多的精力专注于程序的逻辑处理。在Vue中事件修饰符主要有:

  • .stop等同于JavaScript中的event.stopPropagation()防止事件冒泡
  • .prevent等同于JavaScript中的event.preventDefault()防止执行预设的行为(比如阻止a链默认跳转和form表单提交,注意:如果事件可取消,则取消该事件,而不阻止事件的进一步传播
  • .capture与事件冒泡的方向相反,事件捕获由外到内
  • .self只当事件在该元素本身(而不是子元素)触发时触发回调
  • .once:只会触发一次

 

<!-- 阻止单击事件冒泡 -->
<a v-on:click.stop="doThis"></a><!-- 提交事件不再重载页面 -->
<form v-on:submit.prevent="onSubmit"></form><!-- 修饰符可以串联 -->
<a v-on:click.stop.prevent="doThat"></a><!-- 只有修饰符 -->
<form v-on:submit.prevent></form><!-- 添加事件侦听器时使用事件捕获模式 -->
<div v-on:click.capture="doThis">...</div><!-- 只当事件在该元素本身(而不是子元素)触发时触发回调 -->
<div v-on:click.self="doThat">...</div>

 

 

.stop 阻止事件冒泡

冒泡事件:嵌套两三层父子关系,然后所有都有点击事件,点击子节点,就会触发从内至外  子节点-》父节点的点击事件,如下

<div class="testPage"> <div class="outeer" @click="outer"> <div class="middle" @click="middle"> <button @click="inner">点击我(^_^)</button></div></div> <p>{{ message }}</p> 
</div>
<script>export default {name: 'Login',data(){return {message:'测试冒泡事件',}},methods: {inner: function () {this.message = 'inner: 这是最里面的Button';console.log(this.message);},middle: function () {this.message = 'middle: 这是中间的Div';console.log(this.message);},outer: function () {this.message = 'outer: 这是外面的Div';console.log(this.message);}}}
</script>

 

在点击上加上.stop相当于调用了event.stopPropagation(),阻止了事件冒泡传递,点击子节点不会捕获到父节点的事件。代码如下

<div class="testPage"> <div class="outeer" @click="outer"> <div class="middle" @click.stop="middle"> <button @click="inner">点击我(^_^)</button></div></div> <p>{{ message }}</p> 
</div>

效果如下,

 

.prevent取消默认事件

说明:该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作)。例如,如果 type 属性是 "submit",在事件传播的任意阶段可以调用任意的事件句柄,通过调用该方法,可以阻止提交表单。注意,如果 Event 对象的 cancelable 属性是 fasle,那么就没有默认动作,或者不能阻止默认动作。无论哪种情况,调用该方法都没有作用。

如下可以阻止a超链接标签的默认跳转

<a href="home" @click.prevent>跳转</a>

 

.native 修饰符

.native - 监听组件根元素的原生事件。 主要是给自定义的组件添加原生事件。普通的标签使用.native修饰事件是无效的,如下

   <button @click.native="clickFn">测试native的作用</button><el-button type="primary" @click.native="clickFn">组件上使用native的作用</el-button>

 

 

按键修饰符

在监听键盘事件时,我们经常需要监测常见的键值。 Vue 允许为 v-on 在监听键盘事件时添加按键修饰符:

<!-- 只有在 keyCode 是 13 时调用 vm.submit() -->
<input v-on:keyup.13="submit"><input v-on:keyup.enter="submit"><!-- 缩写语法 -->
<input @keyup.enter="submit">

 

全部的按键别名:记住所有的 keyCode 比较困难,所以 Vue 为最常用的按键提供了别名:

  • .enter
  • .tab
  • .delete (捕获 “删除” 和 “退格” 键)
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right

 

可以通过全局 config.keyCodes 对象自定义按键修饰符:

// 可以使用 v-on:keyup.f1
Vue.config.keyCodes.f1 = 112

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue中路径的配置使用

绝对路径使用&#xff1a; 在项目中build文件夹下的webpack.base.conf.js的 使用如下&#xff1a; import mock from /mock/mock.js; html 相对路径使用 1. 当需要引用 同一目录下的文件&#xff0c;直接输入文档, 如下 <img src”bg.jpg” /> 2、当需要引用下一级目录…

腾讯视频如何设置缓存画质和个数

腾讯视频如何设置缓存画质和个数 我们在使用腾讯视频缓存的时候可以更改缓存的画质和缓存个数&#xff0c;下面几步教你操作! 1、在手机上直接打开腾讯视频APP 2、进入个人中心&#xff0c;点击设置 3、在设置中&#xff0c;点击缓存清晰度 4、有四个清晰度可以进行更改&a…

怎么关闭默认使用腾讯视频播放视频文件

我们在使用qq的时候会收到一些视频文件&#xff0c;当我们打开视频文件的时候会发现默认使用腾讯视频播放&#xff0c;那么本文播放器家园网小编要给大家分享的是怎么取消或者是关闭掉默认使用腾讯视频播放视频。 1   找到QQ&#xff0c;点击打开。 2   找到主菜单图标&am…

vue2开发中$emit 、$on 、$once 、$off 的使用, vue中$root、$refs、$parent 的使用

一、vue2开发中$emit 、$on 、$once 、$off 的使用 简单概述&#xff1a; 1、vm.$emit(eventName,callback) 和 $on(eventName,callback) 一般结合使用。使用$emit触发当前实例上的自定义事件&#xff08;并将附加参数都传给监听器回调&#xff09;&#xff0c;使用 $on 监听…

淘宝账号如何登陆优酷视频

本文播放器家园网小编给大家分享淘宝账号如何登陆优酷视频?如今的淘宝网还可以登陆许多网址了&#xff0c;想要知道怎样用淘宝帐号登陆优酷视频吗?小编今日教大伙儿如何做。 01、 最先开启搜狗浏览器&#xff0c;随后键入“优酷视频”&#xff0c;在下面的选择项中挑选含有官…

常用MIME类型,解决IIS布署后字体文件、mp4视频文件等not found 的错误

前言&#xff1a;项目在本地运行正常&#xff0c;但部署在IIS服务器后使用浏览器访问项目会报&#xff1a;404 not found 错误&#xff0c;包括mp4视频文件和woff文件找不到。。如下 原因&#xff1a;在IIS中没有将 .mp4和 .woff 后缀的相应的MIME类型&#xff0c;使得 .mp4等格…

win7电脑屏幕亮度怎么调节

win7电脑屏幕亮度怎么调节?有用户想要调节电脑屏幕亮度&#xff0c;操作方法有很多。下面小编就和大家分享win7电脑屏幕亮度的几个调节方法。大家可以通过快捷键组合、显示器调节按钮、系统设置、第三方软件等方式实现。 1、笔记本一般可以通过笔记本键盘组合键实现调节&…

让IE6\7\8支持Html5和CSS3的各类JS和Htc归纳(html5shiv.js、respond.js、background-size.htc、ie-css3.htc、pie.htc等)

前言&#xff1a; 由于IE6/IE7/IE8还有很大一部分用户&#xff0c;为了让网站浏览者都能正常的访问HTML5网站&#xff0c;解决方案就有下面两个&#xff1a; 1. 为网站创建多套模板&#xff0c;通过程序对User-Agent的判断给不同的浏览器用户显示不同的页面&#xff0c;这样的…

win7电脑连不上网怎么办

win7电脑连不上网怎么办?如今的电脑如果没有网络&#xff0c;那基本等于全废了&#xff0c;毕竟大家的电脑总不能一直用于单机办公和娱乐吧。因此&#xff0c;遇到电脑连不上网络的情形是相当令用户感到头疼的。下面小编就和大家分享几个常见的引起win7电脑连不上网的解决方法…

浏览器兼容video视频播放的多种方法

前言&#xff1a; 在 HTML 中播放视频并不容易&#xff01;因为直到现在&#xff0c;仍然不存在一项旨在网页上显示视频的标准。今天&#xff0c;大多数视频是通过插件&#xff08;比如 Flash&#xff09;来显示的。然而&#xff0c;并非所有浏览器都拥有同样的插件。 比如win…

win7系统如何取消自动开机

最近有位win7系统用户在使用电脑的过程中&#xff0c;发现电脑总是半夜自动开机&#xff0c;用户不知道怎么解决这个问题&#xff0c;为此非常苦恼&#xff0c;那么win7系统如何取消自动开机呢?今天小编为大家介绍win7系统取消自动开的操作教程。 win7系统如何取消自动开机 …

px、em、rem区别介绍

PX px像素&#xff08;Pixel&#xff09;。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。 PX特点 1. IE无法调整那些使用px作为单位的字体大小&#xff1b;2. 国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位&#xff1b;3. Firefox能够调整px和em…

win7系统如何清理系统日志

相信很多电脑用户都知道&#xff0c;电脑系统在运行的时候会产生系统日志&#xff0c;它可以记录系统中的硬件、软件和系统的各种问题信息&#xff0c;可以通过它检索错误发生的原因&#xff0c;不过时间长了&#xff0c;这类日志文件就会积压&#xff0c;导致系统存储变小&…

pdf文件加密解密,pdf忘记密码解密的办法

1、pdf文件加密 步骤&#xff1a;wps》菜单“保护”》文档加密&#xff0c;设置编辑及页面密码&#xff0c;如下 2、pdf解密 在解密窗口取消选择“设置编辑及页面密码”&#xff0c;如下 注意&#xff1a;当忘记pdf密码时&#xff0c;可以使用pdf解密软件解密&#xff0c;如下…

2021-06-07

如何解决360浏览器卡死的问题 我们在上网的时候&#xff0c;不可缺少的就是浏览器了&#xff0c;有一大部分人还是喜欢用360浏览器的。刚开始用360浏览器的时候感觉很不错&#xff0c;都都不知什么情况&#xff0c;老是无故崩溃&#xff0c;或者时常卡死&#xff0c;上网慢&am…

伪类::selection自定义文本选中时的样式(CSS3样式),CSS3的word-break单次换行

1、::selection CSS3伪类自定义文本选中时的样式 有的人在浏览网页时&#xff0c;喜欢一边选中文本一边阅读。在windows环境下&#xff0c;正常的文本选中应该是深蓝色背景白色文本的样式。那么想要修改文本选中样式&#xff0c;可以通过css中有这样的一个伪类::selection用于自…

如何打造高大上的微信朋友圈 打造微信高逼格朋友圈教程

1、注意发朋友圈的频率&#xff0c;单次动态不要超过两条 学会给自己的朋友圈排期看起来简单&#xff0c;其实真的做起来非常难&#xff0c;这就和每天坚持做十个俯卧撑和写文章一样难&#xff0c;很少有人能够坚持下来&#xff0c;但是坚持下来的人&#xff0c;往往都收获了惊…

修改elementUI组件样式无效的多种解决方式

前言&#xff1a;vueelementUI项目开发中&#xff0c;经常遇到修改elementUI组件样式无效的问题&#xff0c; 原因&#xff1a;在vue组件中我们经常需要给style添加scoped来使得当前样式只作用于当前组件的节点。添加scoped之后&#xff0c;工作原理是将当前组件的节点添加一个…

火狐浏览器怎么样 火狐浏览器都有哪些优缺点

火狐浏览器是一个自由及开放源代码的网页浏览器&#xff0c;支持主流的全部系统&#xff0c;最近不少朋友问我火狐浏览器怎么样?作为一名火狐浏览器的用户&#xff0c;在这边给大家介绍火狐浏览器的各种优缺点&#xff0c;赶紧搬好小椅子&#xff0c;介绍开始啦。 火狐浏览器…

CSS3 @media媒体查询 适配不同尺寸设备的响应式布局(清晰详解)

随着宽屏的不断普及&#xff0c;CSS3出现了media媒体查询技术 一、了解Media 相关知识 1、了解Media Queries Media Queries能在不同的条件下使用不同的样式&#xff0c;使页面在不同在终端设备下达到不同的渲染效果。其原理就是允许添加表达式用以媒体查询&#xff08;包括媒…