1、使用浏览器监听切屏为例

此处为考虑浏览器兼容性推荐使用:document.addEventListener

1.1、正常函数使用如下:

let n = 0;
let max = 3; // 切屏最大次数
document.addEventListener("visibilitychange", function () {
if(document.visibilityState == 'hidden'){
n++;
} else if(document.visibilityState == 'visible') {
if (n > max) {
this.$alert('你已经切换离开考试页面超过'+max+"次系统将自动提交答卷!", '警告', {
confirmButtonText: '知道了',
callback: action => {
this.msgSuccess("系统自动提交答卷!");
}
});
return;
}
this.$alert('你已经切换离开考试页面'+n+'次,如果超过'+max+"次系统会自动提交答卷,请认真作答!", '警告', {
confirmButtonText: '知道了',
callback: action => {}
});
}
});

this.$alert()为vue的MessageBox弹框组件

运行后报:提示this.$alert()不是一个函数

此时我们尝试在document函数里面打印this到控制台看看

console.log("this===",this);

控制台输出信息:指向的是调用addEventListener的对象

我们使用document对象去调用VueJS的组件函数肯定是行不通的,那么怎样可以拿到VueJS的this呢?我们只需稍作修改

1.2、bind()绑定事件指定函数

修改后的代码如下:

let n = 0;
let max = 3; // 切屏最大次数
let fn = function () {
console.log("this===",this);
if(document.visibilityState == 'hidden'){
n++;
} else if(document.visibilityState == 'visible') {
if (n > max) {
this.$alert('你已经切换离开考试页面超过'+max+"次系统将自动提交答卷!", '警告', {
confirmButtonText: '知道了',
callback: action => {
this.msgSuccess("系统自动提交答卷!");
}
});
return;
}
this.$alert('你已经切换离开考试页面'+n+'次,如果超过'+max+"次系统会自动提交答卷,请认真作答!", '警告', {
confirmButtonText: '知道了',
callback: action => {}
});
}
}
// 使用bind绑定的事件才是指向函数,否则指向的是调用addEventListener的对象
document.addEventListener("visibilitychange", fn.bind(this));

详解:

  1. 将触发事件后执行的函数抽到外部,作为外部函数并赋予函数名
  2. 在事件中使用函数名.bind('指定函数');即可在执行的函数中获取到bind绑定的指定函数

控制台查看此时的this为

效果图:

参考博文:https://www.jb51.net/article/253509.htm

VueJS使用addEventListener的事件如何触发执行函数的this的更多相关文章

  1. js autocomplete输入延迟触发执行事件

    需求:延迟查询,autocomplete延迟触发执行事件.当有下一个事件开始时,本次事件中断.目的是为了防止调用服务器过于频繁. var timeout = 0;//延时处理 $("#cus ...

  2. JS事件 卸载事件 当用户退出页面时(页面关闭、页面刷新等),触发onUnload事件,同时执行被调用的程序。注意:不同浏览器对onunload事件支持不同。

    卸载事件(onunload) 当用户退出页面时(页面关闭.页面刷新等),触发onUnload事件,同时执行被调用的程序. 注意:不同浏览器对onunload事件支持不同. 如下代码,当退出页面时,弹出 ...

  3. JS事件 文本框内容改变事件(onchange)通过改变文本框的内容来触发onchange事件,同时执行被调用的程序。

    文本框内容改变事件(onchange) 通过改变文本框的内容来触发onchange事件,同时执行被调用的程序. 如下代码,当用户将文本框内的文字改变后,弹出对话框"您改变了文本内容!&quo ...

  4. JS事件 失焦事件(onblur)onblur事件与onfocus是相对事件,当光标离开当前获得聚焦对象的时候,触发onblur事件,同时执行被调用的程序。

    失焦事件(onblur) onblur事件与onfocus是相对事件,当光标离开当前获得聚焦对象的时候,触发onblur事件,同时执行被调用的程序. 如下代码, 网页中有用户和密码两个文本框.当前光标 ...

  5. JS事件 鼠标经过事件(onmouseover)鼠标经过事件,当鼠标移到一个对象上时,该对象就触发onmouseover事件,并执行onmouseover事件调用的程序。

    鼠标经过事件(onmouseover) 鼠标经过事件,当鼠标移到一个对象上时,该对象就触发onmouseover事件,并执行onmouseover事件调用的程序. 现实鼠标经过"确定&quo ...

  6. 细说addEventListener与事件捕获

    细说addEventListener与事件捕获.事件冒泡(一)addEventListener的基本用法 在复杂的项目开发中,javascript和html的解耦变得至关重要,我们被推荐使用事件动态绑 ...

  7. javascript避免dom事件重复触发

    /** * 为指定控件添加限制性事件, 该事件在触发之后, 会被移除, 并在指定的时间间隔后, 重新绑定, 适用于避免控件事件被误操作重复触发的场景 * @param {String} domID 要 ...

  8. DOM事件阶段以及事件捕获与事件冒泡先后执行顺序

    平时浏览这么多技术文章,如过不去实践.深入弄透它,这个技术点很快就会在脑海里模糊.要加深印象,就得好好过一遍.重要的事情说三遍,重要的知识写一遍. 开发过程中我们都希望使用别人成熟的框架,因为站在巨人 ...

  9. 自定义事件的触发dispatchEvent

    1. 对于标准浏览器,其提供了可供元素触发的方法:element.dispatchEvent(). 不过,在使用该方法之前,我们还需要做其他两件事,及创建和初始化.因此,总结说来就是: documen ...

  10. (转)js原生自定义事件的触发dispatchEvent

    1. 对于标准浏览器,其提供了可供元素触发的方法:element.dispatchEvent(). 不过,在使用该方法之前,我们还需要做其他两件事,及创建和初始化.因此,总结说来就是: 1 2 3 d ...

随机推荐

  1. 2021.05.09【NOIP提高组】模拟赛总结

    2021.05.09[NOIP提高组]模拟赛总结 T1 T2

  2. java指定时间失效Calendar

    获取第二天的1:30的毫秒数 public static Long getEveryDayTime() { Calendar calendar = Calendar.getInstance(); ca ...

  3. 【opencv-c++】4.1-4.2 图像和大型数组类型

    4.1-4.2 图像和大型数组类型 动态可变的存储 我们将进入大型数组类型的世界,它们之中最主要的当属c v::Mat,这个结构可以视为是OpenCV所有C++实现的核心,OpenCV所有主要函数都或 ...

  4. 飞行时间技术TOF

    文章目录 飞行时间技术TOF 一. 光速的测定 二. 各种TOF技术 直接脉冲TOF 脉冲间接TOF 连续波调制TOF(Continous Wave TOF) 三. TOF技术的应用 飞行时间技术TO ...

  5. Django笔记三十五之admin后台界面介绍

    本文首发于公众号:Hunter后端 原文链接:Django笔记三十五之admin后台界面介绍 这一篇介绍一下 Django 的后台界面使用. Django 自带了一套后台管理界面,可用于我们直接操作数 ...

  6. Prism Sample 14-UsingEventAggregator

    这次是事件聚合器的应用. 事件聚合器应用第一步:定义一个事件聚合器,应该是一个可访问的公共区域,例14为它做了一个core的项目.代码很简单: using Prism.Events; namespac ...

  7. Prism Sample 12-UsingCompositeCommands

    本例中,主页是一个按钮,绑定了一个复合命令,然后下面一个TabControl <Grid> <Grid.RowDefinitions> <RowDefinition He ...

  8. 2022-05-15:N个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输。 问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件; 问题2:至

    2022-05-15:N个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输. 问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件: 问题2:至 ...

  9. OData WebAPI实践-兼容OData集合响应

    本文属于 OData 系列文章 引言 OData 是一个开放标准,已经在 oasis 组织标准化,因此我们可以在标准的官网查询到 OData 的标准请求与返回形式:OData JSON Format ...

  10. Accurate SerDes LineRate

    测试现象:(单板A板载7A series,单板B板载7K series) 1. 单板A板载2个type C接口,通过线缆自环,GTP near-end loopback, OK. 2. 2块单板A,使 ...