日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

Vue 點(diǎn)擊彈窗外部,實(shí)現(xiàn)彈窗關(guān)閉?你有實(shí)現(xiàn)的思路嗎?

來源: 責(zé)編: 時(shí)間:2024-06-25 17:13:21 226觀看
導(dǎo)讀背景記得以前面試官問過我一個(gè)問題:我現(xiàn)在有一個(gè)彈窗,怎樣才能實(shí)現(xiàn)點(diǎn)擊彈窗以外的區(qū)域,實(shí)現(xiàn)關(guān)閉彈窗呢?當(dāng)時(shí)確實(shí)比較菜,沒想出應(yīng)該怎么做才行,因?yàn)楫?dāng)時(shí)我的腦子里只有 click事件,我在想點(diǎn)擊事件不是只能綁定在本元素身上嗎?怎

背景

記得以前面試官問過我一個(gè)問題:我現(xiàn)在有一個(gè)彈窗,怎樣才能實(shí)現(xiàn)點(diǎn)擊彈窗以外的區(qū)域,實(shí)現(xiàn)關(guān)閉彈窗呢?qwa28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)時(shí)確實(shí)比較菜,沒想出應(yīng)該怎么做才行,因?yàn)楫?dāng)時(shí)我的腦子里只有 click事件,我在想點(diǎn)擊事件不是只能綁定在本元素身上嗎?怎么才能點(diǎn)擊其他地方來影響本元素呢?qwa28資訊網(wǎng)——每日最新資訊28at.com

qwa28資訊網(wǎng)——每日最新資訊28at.com

實(shí)現(xiàn)思路

過了一兩年后,回頭發(fā)現(xiàn),其實(shí)實(shí)現(xiàn)并不困難,很多人其實(shí)也都會(huì),換一種說法,面試官想問的是:在 Vue 中,有一個(gè)元素X,怎么做到點(diǎn)擊元素X以外的東西,觸發(fā)綁定在元素X上的事件。qwa28資訊網(wǎng)——每日最新資訊28at.com

我把實(shí)現(xiàn)思路分為幾步:qwa28資訊網(wǎng)——每日最新資訊28at.com

  • 定義一個(gè) Map,來收集彈窗元素
  • 監(jiān)聽 document 的鼠標(biāo)按下、松開事件
  • document 鼠標(biāo)按下時(shí)記錄觸發(fā)的元素A
  • document 鼠標(biāo)松開時(shí)遍歷 Map 中所有彈窗元素,讓這些彈窗元素跟元素A一一比較,不等于則說明是點(diǎn)了彈窗元素外部,等于則說明點(diǎn)擊了彈窗元素內(nèi)部
  • 點(diǎn)擊了外部則觸發(fā)綁定事件,點(diǎn)擊了內(nèi)部則不觸發(fā)

ClickOutside

其實(shí)上面的思路,就是 v-clickoutside的實(shí)現(xiàn)思路,這個(gè)自定義指令,是 Vue 中用的非常廣泛的指令~具體用法是這樣的:qwa28資訊網(wǎng)——每日最新資訊28at.com

cs () {  console.log('點(diǎn)擊外部')}<div v-clickoutside="cs"></div><button>點(diǎn)我</button><button>哈哈哈</button>

當(dāng)你點(diǎn)擊了 div 元素,也就是本元素,并不會(huì)觸發(fā)事件 cs,而當(dāng)你點(diǎn)擊它以外的元素,則會(huì)觸發(fā) cs 事件。qwa28資訊網(wǎng)——每日最新資訊28at.com

代碼實(shí)現(xiàn)

1.TypeScript類型準(zhǔn)備

// vue自帶的一些類型import type { ComponentPublicInstance, DirectiveBinding, ObjectDirective } from 'vue';// 下面會(huì)用到,是記錄綁定事件的函數(shù)type DocumentHandler = <T extends MouseEvent>(mouseup: T, mousedown: T) => void;// Map 的類型// key 是元素本地// value 是綁定的事件type FlushList = Map<  HTMLElement,  DocumentHandler>;

2.綁定事件函數(shù)

首先封裝一個(gè)綁定事件的函數(shù),大家在平時(shí)封裝函數(shù)的時(shí)候一定要注意判空,兜底~qwa28資訊網(wǎng)——每日最新資訊28at.com

export function on(  element: Element | HTMLElement | Document | Window,  event: string,  handler: EventListenerOrEventListenerObject,): void {  if (element && event && handler) {    element.addEventListener(event, handler, false);  }}

3.判斷點(diǎn)擊元素是否是本元素

想一想我們的目的是啥,有一元素A,我需要點(diǎn)擊元素A以外的地方才觸發(fā)綁定的事件,點(diǎn)擊元素A或者元素A以內(nèi)的區(qū)域則不觸發(fā)qwa28資訊網(wǎng)——每日最新資訊28at.com

所以這個(gè)函數(shù)主要做幾件事:qwa28資訊網(wǎng)——每日最新資訊28at.com

  • 判斷點(diǎn)擊的元素是否是本元素(不觸發(fā))
  • 判斷點(diǎn)擊的元素是否在本元素內(nèi)(不觸發(fā))
  • 兜底,判斷元素是否存在(觸發(fā))
function createDocumentHandler(el: HTMLElement, binding: DirectiveBinding): DocumentHandler {  return function (mouseup, mousedown) {    const mouseUpTarget = mouseup.target as Node;    const mouseDownTarget = mousedown.target as Node;    const isBound = !binding || !binding.instance;    const isTargetExists = !mouseUpTarget || !mouseDownTarget;    const isContainedByEl = el.contains(mouseUpTarget) || el.contains(mouseDownTarget);    const isSelf = el === mouseUpTarget;    if (      isBound ||      isTargetExists ||      isContainedByEl ||      isSelf    ) {      return;    }    binding.value();  };}

4.自定義指令

自定義指令的幾個(gè)生命周期里,需要做這些事:qwa28資訊網(wǎng)——每日最新資訊28at.com

  • 綁定時(shí),記錄綁定元素與綁定事件到 nodeList 中
  • 更新時(shí),記錄綁定元素與綁定事件到 nodeList 中
  • 銷毀時(shí),將此元素從 nodeList 中抹除
// 記錄綁定元素的 Mapconst nodeList: FlushList = new Map();const ClickOutside: ObjectDirective = {  beforeMount(el, binding) {    nodeList.set(el,       createDocumentHandler(el, binding));  },  updated(el, binding) {    nodeList.set(el,       createDocumentHandler(el, binding));  },  unmounted(el) {    nodeList.delete(el);  },};export default ClickOutside;

5.監(jiān)聽 document 鼠標(biāo)按下、松開

萬事俱備只欠東風(fēng),現(xiàn)在只需要監(jiān)聽 document 的鼠標(biāo)按下、松開事件 即可,大概分為幾步:;qwa28資訊網(wǎng)——每日最新資訊28at.com

  • 鼠標(biāo)按下時(shí),記錄這個(gè)觸發(fā)的元素
  • 鼠標(biāo)松開時(shí),遍歷 nodeList 中的元素,跟這個(gè)觸發(fā)元素做對(duì)比
  • 符合條件則執(zhí)行綁定事件,不符合則不執(zhí)行
let startClick: MouseEvent;on(document, 'mousedown', (e: MouseEvent) => (startClick = e));on(document, 'mouseup', (e: MouseEvent) => {  for (const { documentHandler } of nodeList.values()) {    documentHandler(e, startClick);  }});

這就實(shí)現(xiàn)了點(diǎn)擊外部觸發(fā)內(nèi)部事件的效果了!qwa28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-96418-0.htmlVue 點(diǎn)擊彈窗外部,實(shí)現(xiàn)彈窗關(guān)閉?你有實(shí)現(xiàn)的思路嗎?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 寧德時(shí)代曾毓群回應(yīng)“奮斗一百天”:號(hào)召練好基本功,沒有強(qiáng)迫大家

下一篇: Java 流式編程的七個(gè)必學(xué)技巧

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 對(duì)標(biāo)蘋果的靈動(dòng)島 華為帶來實(shí)況窗功能

    繼蘋果的靈動(dòng)島之后,華為也在今天正式推出了“實(shí)況窗”功能。據(jù)今天鴻蒙OS 4.0的現(xiàn)場(chǎng)演示顯示,華為的實(shí)況窗可以更高效的展現(xiàn)出實(shí)時(shí)通知,比如鎖屏上就能看到外賣、打車、銀行
  • 石頭智能洗地機(jī)A10 Plus體驗(yàn):雙向自清潔治好了我的懶癌

    一、前言和介紹專為家庭請(qǐng)假懶人而生的石頭科技在近日又帶來了自己的全新旗艦新品,石頭智能洗地機(jī)A10 Plus。從這個(gè)產(chǎn)品名上就不難看出,這次石頭推出的并不是常見的掃地機(jī)器
  • 5月iOS設(shè)備性能榜:M1 M2依舊是榜單前五

    和上個(gè)月一樣,沒有新品發(fā)布的iOS設(shè)備性能榜的上榜設(shè)備并沒有什么更替,僅僅只有跑分變化而產(chǎn)生的排名變動(dòng),剛剛開始的蘋果WWDC2023,推出的產(chǎn)品也依舊是新款Mac Pro、新款Mac Stu
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 講故事上個(gè)月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當(dāng)時(shí)用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反
  • 共享單車的故事講到哪了?

    來源丨??素?cái)經(jīng)與共享充電寶相差不多,共享單車已很久沒有被國內(nèi)熱點(diǎn)新聞關(guān)照到了。除了一再漲價(jià)和用戶直呼用不起了。近日多家媒體再發(fā)報(bào)道稱,成都、天津、鄭州等地多個(gè)共享單
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預(yù)警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業(yè)發(fā)布的ESG報(bào)告。ESG是&ldquo;環(huán)境保
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯(lián)網(wǎng)那些事&ldquo;起猛了,我能看得懂日語了&rdquo;。&ldquo;為什么日本人說話我能聽懂?&rdquo;&ldquo;中文不像中文,日語不像日語,但是我竟然看懂了&rdquo;&hellip;&hell
  • 超閉合精工鉸鏈 徹底消滅縫隙 三星Galaxy Z Flip5與Galaxy Z Fold5發(fā)布

    2023年7月26日,三星電子正式發(fā)布了Galaxy Z Flip5與Galaxy Z Fold5。三星新一代折疊屏手機(jī)采用超閉合精工鉸鏈,讓折疊后的縫隙不再可見。同時(shí),配合處
  • 中關(guān)村論壇11月25日開幕,15位諾獎(jiǎng)級(jí)大咖將發(fā)表演講

    11月18日,記者從2022中關(guān)村論壇新聞發(fā)布會(huì)上獲悉,中關(guān)村論壇將于11月25至30日在京舉行。本屆中關(guān)村論壇由科學(xué)技術(shù)部、國家發(fā)展改革委、工業(yè)和信息化部、國務(wù)
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美日韩一区免费| 在线日本欧美| 久久婷婷国产麻豆91天堂| 亚洲欧洲在线一区| 一本综合精品| 国产伦精品一区二区三区四区免费 | 99国产精品久久久久久久久久| 狠狠色狠狠色综合日日小说| 欧美午夜电影网| 欧美激情精品久久久久久| 久久久久国产一区二区三区四区| 亚洲一区制服诱惑| 日韩天堂在线观看| 亚洲欧洲精品一区| 亚洲高清av在线| 在线播放不卡| 国内偷自视频区视频综合| 国产视频丨精品|在线观看| 欧美天堂在线观看| 欧美日韩精品一区二区天天拍小说 | 亚洲三级影片| 亚洲狠狠丁香婷婷综合久久久| 国模私拍视频一区| 国产午夜精品一区理论片飘花| 国产精品午夜久久| 国产精品入口夜色视频大尺度 | 久久国产黑丝| 久久国产精品亚洲va麻豆| 性久久久久久久久| 香蕉久久国产| 欧美一区二视频在线免费观看| 亚洲永久在线观看| 亚洲欧美日本视频在线观看| 亚洲欧美激情一区二区| 亚洲欧美在线x视频| 亚洲女人天堂成人av在线| 亚洲免费在线观看视频| 亚洲欧美一区二区三区极速播放 | 久久超碰97人人做人人爱| 欧美一区二区观看视频| 欧美一区1区三区3区公司| 欧美一区二区视频免费观看 | 欧美日韩成人精品| 欧美性猛交xxxx乱大交退制版 | 悠悠资源网久久精品| 在线观看视频免费一区二区三区| 尤物视频一区二区| 亚洲黄一区二区三区| 亚洲乱码国产乱码精品精98午夜| 99视频在线观看一区三区| 亚洲视屏在线播放| 性欧美大战久久久久久久久| 久久精品中文字幕一区| 麻豆91精品| 欧美日韩高清区| 国产精品捆绑调教| 国产麻豆精品久久一二三| 国内精品99| 亚洲黑丝在线| 亚洲视频在线视频| 欧美在线精品一区| 欧美freesex交免费视频| 欧美涩涩视频| 国产综合色在线| 亚洲日本乱码在线观看| 亚洲免费网址| 久久先锋资源| 欧美伦理视频网站| 国产欧美精品国产国产专区| 尤物九九久久国产精品的特点| 亚洲另类自拍| 欧美中文字幕不卡| 欧美高清在线一区| 国产精品视频xxx| 亚洲第一在线综合网站| 国产精品99久久99久久久二8| 欧美一区二区私人影院日本| 欧美v亚洲v综合ⅴ国产v| 国产精品国产三级国产aⅴ无密码| 国产主播一区二区三区| 亚洲裸体俱乐部裸体舞表演av| 亚洲欧洲99久久| 欧美aa国产视频| 国产精品手机视频| 亚洲国产天堂久久综合网| 亚洲一区二区三区四区中文| 久久婷婷av| 国产精品主播| 日韩视频免费观看高清在线视频| 欧美一区二区三区日韩视频| 欧美精品在线一区二区| 国产尤物精品| 亚洲视频在线看| 久热精品在线| 国产精品亚发布| 日韩视频在线观看| 久久久免费精品| 国产精品成人播放| 亚洲国产精品久久久久久女王| 亚洲欧美成人一区二区三区| 欧美激情五月| 一区二区三区我不卡| 亚洲欧美日韩精品久久亚洲区 | 99视频在线观看一区三区| 欧美一级淫片播放口| 欧美日产一区二区三区在线观看| 国产日韩精品视频一区二区三区| 日韩视频二区| 蜜臀久久99精品久久久画质超高清| 国产精品亚洲一区| 99ri日韩精品视频| 蜜桃av噜噜一区| 国产夜色精品一区二区av| 亚洲视频在线观看视频| 欧美精品麻豆| 亚洲国产高清一区| 久久精品亚洲一区二区三区浴池| 国产精品久久77777| 最新中文字幕一区二区三区| 久久久久9999亚洲精品| 国产区在线观看成人精品| 亚洲视频久久| 欧美人妖在线观看| 亚洲国产网站| 快射av在线播放一区| 国内精品美女av在线播放| 欧美一级理论性理论a| 国产精品理论片在线观看| 99精品国产在热久久婷婷| 欧美成年网站| 亚洲第一级黄色片| 久久久久久一区二区| 国产午夜精品全部视频播放| 午夜激情综合网| 国产精品男gay被猛男狂揉视频| 一区二区激情小说| 欧美日韩国产综合在线| 日韩视频免费在线观看| 欧美成人一二三| 亚洲国产视频直播| 男人的天堂成人在线| 在线看成人片| 免费黄网站欧美| 亚洲福利精品| 欧美fxxxxxx另类| 最近看过的日韩成人| 欧美黑人一区二区三区| 亚洲人体偷拍| 欧美女主播在线| 99国产精品99久久久久久| 欧美日本久久| 一区二区国产精品| 欧美色欧美亚洲另类七区| 在线视频欧美一区| 国产精品成人一区二区三区吃奶| 一区二区三区国产盗摄| 欧美视频中文字幕| 亚洲一区精品电影| 国产精品入口尤物| 欧美一级视频| 在线播放日韩专区| 欧美jjzz| 亚洲视频免费看| 国产精品一区二区欧美| 欧美在线啊v| 在线不卡亚洲| 欧美日本在线看| 亚洲视频在线二区| 国产亚洲综合在线| 欧美成人三级在线| 一本色道久久综合亚洲精品不 | 美女久久一区| 亚洲精品久久嫩草网站秘色| 欧美日本一道本| 亚洲男女自偷自拍| 国产亚洲aⅴaaaaaa毛片| 久久五月婷婷丁香社区| 亚洲区国产区| 国产精品第一页第二页第三页| 欧美一级片在线播放| 激情综合网激情| 欧美区一区二区三区| 午夜精品久久久久久久男人的天堂| 国内精品模特av私拍在线观看| 免费日韩成人| 在线亚洲欧美专区二区| 国产婷婷一区二区| 欧美精品亚洲二区| 亚洲欧美网站| 亚洲国产高清视频| 国产精品超碰97尤物18| 久久噜噜亚洲综合| 99视频精品| 国产亚洲欧美日韩日本| 欧美精品v日韩精品v韩国精品v| 亚洲欧美日本在线| 亚洲激情视频网站| 国产女人18毛片水18精品| 久热精品视频在线观看| 亚洲一区二区免费视频| 悠悠资源网久久精品| 欧美日韩国产一区二区三区| 欧美一区二区私人影院日本 | 久久久精品性|