<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近在專案中需要用到addEventListener監聽卷軸捲動的高度,所以就研究了一下在vue中是怎麼進行事件監聽的。
給要新增事件的元素加上ref屬性
在mounted中新增事件
mounted() { this.$refs.box.addEventListener('scroll',()=>{ console.log('scroll',this.$refs.box.scrollTop) }); }
這樣就新增成功了!
如果要移除已新增的事件,removeEventListener中傳入的方法必須和addEventListener中傳入的是同一個方法才能成功移除,所以在新增時就不能用匿名函數啦。需改成如下寫法
mounted() { this.$refs.box.addEventListener('scroll',this.scrollEvent); }, methods:{ scrollEvent(){ console.log('scroll',this.$refs.box.scrollTop) } }
這裡要注意 傳入的方法 this.scrollEvent 後面不能加括號,否則無法成功新增
元件銷燬前移除事件
beforeDestroy() { this.$refs.box.removeEventListener('scroll',this.scrollEvent); }
如果是keep-alive元件,可以用下面這種方式
activated() { this.$refs.box.addEventListener('scroll', this.scrollEvent); }, deactivated(){ this.$refs.box.removeEventListener('scroll',this.scrollEvent); },
另外,addEventListener還可以給一個元素新增多個事件,並且不會覆蓋已存在的事件,這裡就不多展開了~
擴充套件知識:
此處為考慮瀏覽器相容性推薦使用:document.addEventListener
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呢?我們只需稍作修改
修改後的程式碼如下:
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));
詳解:
將觸發事件後執行的函數抽到外部,作為外部函數並賦予函數名在事件中使用函數名.bind('指定函數')
;即可在執行的函數中獲取到bind繫結的指定函數
控制檯檢視此時的this為
效果圖:
下面介紹下vue 監聽事件addEventListener
程式碼如下所示:
// vue 新增監聽事件,addEventListener第二個引數要綁在this上,即需要在methods中宣告,否則銷燬的時候會報錯 // 在mounted中監聽,在beforeDestroy中銷燬,繫結的事件在methods中宣告 mounted() { // 監聽 window.addEventListener('resize', this.handleEventListener) }, beforeDestroy() { // 銷燬 window.removeEventListener('resize', this.handleEventListener) }, methods: { // 監聽執行的事件 handleEventListener() { }, }
到此這篇關於解析Vuejs使用addEventListener的事件觸發執行函數的this問題的文章就介紹到這了,更多相關vuejs addEventListener的事件觸發內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45