Vuejs使用addEventListener的事件如何触发执行函数的this

 更新时间:2022年06月29日 16:01:46   作者:schwarzeni  
这篇文章主要介绍了Vuejs使用addEventListener的事件触发执行函数的this方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

使用addEventListener事件触发执行函数的this

在普通的dom操作中,若是使用addEventListener

如下面的例子

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="btn_container">
    <button id="btn">Click Me</button>
</div>
<script src="test.js"></script>
</body>
</html>
let fn  = function() {
  console.log(this);
};
document.getElementById('btn').addEventListener('click',fn);    

那么,在控制台中输出的this的值为触发事件的dom节点

(另:有用的链接 => 传送门)

如果是使用vuejs中的自定义directive来触发点击事件,触发函数中的this又是什么呢

/**
 * 这是vuejs的一个模块
 */
<template>
        <div class="container">
            <div class="row">
                <div class="col-xs-12 col-sm-8 col-sm-offset-2 col-md-6 col-md-offset-3">
                    <button class="btn btn-primary" v-myOn:click="fn">Click me</button>
                </div>
            </div>
        </div>
</template>
<script>
  export default {
    directives: {
      myOn: {
        bind(el, binding, vnode) {
          const event = binding.arg;
          const fn = binding.value;
          console.log(el);
          el.addEventListener(event, fn);
        }
      }
    },
    methods: {
      fn() {
        console.log(this);
      }
    }
  }
</script>   

经过测试,这里控制台输出的this的值为:

这是一个虚拟dom的值,其中 $el的值为 div.container ,也就是此模块最外层的dom节点,但是此事件绑定的是button,控制台中输出的bind的第一个el的值为

那么,在测试一次,在此 <div class='container'> 的外层再添加一个 <div class='outer-container'>

测试结果如下:

$el 的值依然为最外层的dom节点

结论:Vuejs中若是使用自定义的directive绑定事件,那么触发事件后执行函数中的this指向此模块最外层的dom节点

addEventListener中事件函数的this指向问题

看代码

//定义一个可见的盒子用于绑定点击事件
var box = document.getElementById('box');
box.x = 'box'
//设置执行函数的对象属性
function outFunc() {
  this.x = 'outFunc';
  box.addEventListener('click', func, false);
}
outFunc();
function func() {
  console.log(this.x); //输出box 说明该this指向的是调用addEventListener的对象
}

代码2

function outFunc() {
  this.x = 'outFunc';//给全局对象window.x赋值(相当于赋值全局变量)
  box.addEventListener('click', func.bind(this), false);
}
function func() {
  console.log(this.x); //输出outFunc 使用bind设置this的值
}

总结:使用bind绑定的事件才是指向函数,否则指向的是调用addEventListener的对象。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • 详解Vue.js中的组件传值机制

    详解Vue.js中的组件传值机制

    Vue.js 是一款流行的前端框架,它提供了一些方便的机制来管理组件之间的通信,其中包括组件传值,本文将详细介绍 Vue.js 中的组件传值机制,包括父子组件传值、兄弟组件传值、跨级组件传值等多种方式,需要的朋友可以参考下
    2023-08-08
  • vue Cli 环境删除与重装教程 - 版本文档

    vue Cli 环境删除与重装教程 - 版本文档

    这篇文章主要介绍了vue Cli 环境删除与重装教程 - 版本文档,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • vue + qiankun 项目搭建过程

    vue + qiankun 项目搭建过程

    这篇文章主要介绍了vue + qiankun 项目搭建,首先是通过cli3构建vue2项目,通过qiankun改造主应用,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 浅析vue3项目中自定义指令的运用

    浅析vue3项目中自定义指令的运用

    自定义指令是一种在Vue应用程序中扩展HTML标签的能力,通过自定义指令,我们可以直接在模板中使用指令名,下面我们就来看看项目中具体如何使用自定义指令的吧
    2023-08-08
  • 在Vue中实现Excel导出功能(数据导出)

    在Vue中实现Excel导出功能(数据导出)

    本文分享了如何在前端导出Excel文件,强调了前端导出的即时性、便捷性、灵活性和定制化优势,以及减轻后端服务器负担的特点,详细介绍了ExcelJS和FileSaver.js两个工具库的使用方法和主要功能,最后通过Vue实现了Excel的导出功能
    2024-10-10
  • Ant-design-vue Table组件customRow属性的使用说明

    Ant-design-vue Table组件customRow属性的使用说明

    这篇文章主要介绍了Ant-design-vue Table组件customRow属性的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • vue编写简单的购物车功能

    vue编写简单的购物车功能

    这篇文章主要为大家详细介绍了vue编写简单的购物车功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • vue-cli中的图片资源存放位置详解

    vue-cli中的图片资源存放位置详解

    这篇文章主要介绍了vue-cli中的图片资源存放位置,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Element UI 上传组件实现文件上传并附带额外参数功能

    Element UI 上传组件实现文件上传并附带额外参数功能

    在使用 ElementUI 的上传组件 el-upload 实现文件上传功能时,如果单文件上传是比较简单的,但是在实际需求中,往往会在上传文件时伴随着一些其他参数,怎么操作呢,下面通过示例代码讲解感兴趣的朋友一起看看吧
    2023-08-08
  • 解决vue-cli + webpack 新建项目出错的问题

    解决vue-cli + webpack 新建项目出错的问题

    下面小编就为大家分享一篇解决vue-cli + webpack 新建项目出错的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03

最新评论