美文网首页
事件处理

事件处理

作者: 车在路上爬fly | 来源:发表于2020-12-29 15:49 被阅读0次

监听事件


可以用v-on指令监听DOM事件,并在触发运行一些js代码。
示例:

<div id="example-1">
//v-on 可以直接执行一段代码或者一个方法
  <button v-on:click="counter += 1">Add 1</button>
  <p>The button above has been clicked {{ counter }} times.</p>
</div>

var example1 = new Vue({
  el: '#example-1',
  data: {
    counter: 0
  }
})

事件处理方法


v-on可以接收一个方法:

<div id="example-2">
  <!-- `greet` 是在下面定义的方法名 -->
  <button v-on:click="greet">Greet</button>
</div>

var example2 = new Vue({
  el: '#example-2',
  data: {
    name: 'Vue.js'
  },
  // 在 `methods` 对象中定义方法
  methods: {
    greet: function (event) {
      // `this` 在方法里指向当前 Vue 实例
      alert('Hello ' + this.name + '!')
      // `event` 是原生 DOM 事件
      if (event) {
        alert(event.target.tagName)
      }
    }
  }
})

// 也可以用 JavaScript 直接调用方法
example2.greet() // => 'Hello Vue.js!'

内联处理器中的方法


除了直接绑定到一个方法,也可以在内联js语句中调用方法:

<div id="example-3">
  <button v-on:click="say('hi')">Say hi</button>
  <button v-on:click="say('what')">Say what</button>
</div>

new Vue({
  el: '#example-3',
  methods: {
    say: function (message) {
      alert(message)
    }
  }
})

又是也需要在内联语句处理器中访问原始的DOM事件。可以用特殊变量$event把它传入方法:

<button v-on:click="warn('Form cannot be submitted yet.', $event)">
  Submit
</button>

//事件
methods: {
  warn: function (message, event) {
    // 现在我们可以访问原生事件对象
    if (event) {
      event.preventDefault()
    }
    alert(message)
  }
}

事件修饰符


在事件处理程序中调用event.preventDefault()event.stopPropagation() 是很常见的需求。(尽管我们可以在方法中轻松实现这点,但更好的方式是:方法只有纯粹的数据逻辑,而不是去处理DOM事件细节。
为了解决这个问题,Vue.js为v-on提供了事件修饰符。修饰符是由点开头的指令后缀来表示的。

  • .stop 阻止事件继续向下传递
  • .prevent 提交事件不在重载页面
  • .capture 当元素发生冒泡时,先触发带有该修饰符的元素
  • .self 跳过冒泡事件和捕获事件,只有直接作用在该元素上的事件才可以执行。
  • .once 只执行一次
  • .passive
<!-- 阻止单击事件继续传播 -->
<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>

<!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
<!-- 即事件不是从内部元素触发的 -->
<div v-on:click.self="doThat">...</div>

使用修饰符时,顺序很重要,相应的代码会以同样的顺序产生。因此,用v-on:click.prevent.self会阻止所有的点击,而v-on:click.self.prevent 只会阻止对元素自身的点击。

Vue还对应addEventListener中的 passive选项提供了 .passive修饰符。

<!-- 滚动事件的默认行为 (即滚动行为) 将会立即触发 -->
<!-- 而不会等待 `onScroll` 完成  -->
<!-- 这其中包含 `event.preventDefault()` 的情况 -->
<div v-on:scroll.passive="onScroll">...</div>

这个.passive修饰符尤其能够提升移动端的性能。

\color{red}{注意:}不要把.passive.prevent一起使用,因为.prevent将会被忽略,而且浏览器可能会有一个警告。请记住:.passive会告诉浏览器你 不想阻止事件的默认行为。

按键修饰符


在监听键盘事件时,经常需要检查详细的按键。Vue允许为v-on在监听键盘事件时添加按键的修饰符:

<!-- 只有在 `key` 是 `Enter` 时调用 `vm.submit()` -->
<input v-on:keyup.enter="submit">

你可以直接将keyboardEvent.key暴露的任意有效按键名转换为kebab-case来作为修饰符。

<input v-on:keyup.page-down="onPageDown">

在上述示例中、处理函数只会在$event.key等于PageDown时被调用。

按键码

keycode的事件用法\color{green}{已经被废弃了}并可能不会被最新的浏览器支持。
使用keycode属性也是允许的:

<input v-on:keyup.13="submit">

为了在必要的情况下支持就浏览器,Vue提供了绝大多数常用的按键码别名:

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

有一些按键(.esc以及所有的方向键)在IE9中有所不同的key值,如果你想支持IE9,这些内置别名应该是首选。

你还可以通过全局config.keycodes对象自定义按键修饰符别名:

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

系统修饰键


2.1.0新增

可以用如下修饰符来实现仅在按下相应按键时才触发鼠标或者键盘事件的监听器。

  • .ctrl
  • .alt
  • .shift
  • .meta

例如:

<!-- Alt + C -->
<input v-on:keyup.alt.67="clear">

<!-- Ctrl + Click -->
<div v-on:click.ctrl="doSomething">Do something</div>

请注意修饰键与常规键不同,在和keyup事件一起用时,事件触发时修饰键必须处于按下状态。换句话说,只有在按住ctrl的情况下释放其他按键,才能触发keyup.ctrl。而单单释放ctrl也不会触发事件。如果你想要这样的行为,请为ctrl换用keycode:keyup.17

.exact修饰符

.exact修饰符允许你控制由精确的系统修饰符组合触发的事件。

<!-- 即使 Alt 或 Shift 被一同按下时也会触发 -->
<button v-on:click.ctrl="onClick">A</button>

<!-- 有且只有 Ctrl 被按下的时候才触发 -->
<button v-on:click.ctrl.exact="onCtrlClick">A</button>

<!-- 没有任何系统修饰符被按下的时候才触发 -->
<button v-on:click.exact="onClick">A</button>
鼠标按键修饰符
  • .left
  • .right
  • .middle
    这些修饰符会限制处理函数仅响应特定的鼠标按钮。

相关文章

  • JS 事件

    目录 事件流 事件处理程序HTML事件处理程序DOM0级事件处理程序DOM2级事件处理程序IE事件处理程序跨浏览器...

  • react事件处理

    一,事件处理 写法:on+事件名称= {事件处理函数} 类组件触发写法on+事件名称 = 事件处理函数 ---...

  • 跨浏览器的事件处理程序

    事件处理程序有DOM0级事件处理程序、DOM2级事件处理程序,IE事件处理程序,DOM0级事件处理程序具有简单,跨...

  • App事件中心

    App事件中心,事件的的生产端和处理端分离,事件处理结果广播通知,事件状态(初始化、处理中和处理完成)管理,事件类...

  • Chapter 07. Broadcast

    阅读原文 7.1 . 理论概述 广播事件处理属于系统级的事件处理(一般事件处理是属于View级的事件处理) 一个应...

  • iOS和Flutter里的事件处理

    目录先说一下事件处理里的被处理者:事件一、iOS里的事件二、Flutter里的事件然后说一下事件处理里的处理者:响...

  • react文档——事件处理

    事件处理 React 元素的事件处理和 DOM 元素的事件处理非常相似。但也有一些语法差异: React 事件使用...

  • DOM事件的问题!

    1.事件冒泡 2.事件捕获 事件处理程序 1.HTML事件处理程序 2.DOM 0级事件处理程序 3.DOM 2级...

  • 2021-09-22 GUI(事件监听机制)

    事件监听机制组成事件源(组件)事件(Event)监听器(Listener)事件处理(引发事件后处理方式) 事件监听...

  • attachEvent和addEventListener区别

    attachEvent是IE的事件处理方法,是DOM0事件处理程序,只能在事件冒泡阶段触发。接收两个参数,事件处理...

网友评论

      本文标题:事件处理

      本文链接:https://www.haomeiwen.com/subject/dzmfoktx.html