亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

一個因@click.stop引發的bug的解決

2019-11-19 12:18:32
字體:
來源:轉載
供稿:網友

問題

在項目頁面中使用 element popover,設置trigger='click'時點擊外部不會觸發自動隱藏,但在 element 官網中是可以正常觸發的(官方示例),項目中的菜單是自定義寫的,所以懷疑是有黑魔法。

查找原因

  1. 將 popover 寫在app.vue根組件內,發現可以正常觸發自動隱藏。
  2. 在app.vue的 mounted 鉤子中加入window.addEventListener('click', () => console.log('window click===>>>>')),發現只有菜單欄外層能夠觸發。
  3. 檢查菜單欄組件,發現代碼中<div class="main" @click.stop="isShowWhole = false">,這里的 click 事件使用了 stop 修飾符(阻止冒泡),可能阻止了 popover 外部點擊的事件判斷,嘗試將 stop 修飾符去掉,發現外部點擊事件正常觸發。

確認代碼修改沒有副作用

在修復 bug 時,需要注意不會產生額外的 bug,那就需要了解修改的這段代碼的含義

@click.stop="isShowWhole = false"

從代碼上看,點擊 class 為 main 的 div 將會觸發左邊側邊欄縮略顯示,加上 stop 修飾符是為了防止事件冒泡,所以能否去掉 stop 需要確認是否有這個必要。

// router.jslet routes = [  {   path: '/',   alias: '/admin',   component: Menu,   children: [...Pages],  },  {   path: '*',   name: '404',   component: NotFound,  }, ];

在路由中可以看到,Menu 是作為根路由進行渲染,除了 404 頁面都是它的子路由,所以 stop 修飾符是沒有必要加上的,去除后經過測試沒有其他影響。

深入 element popover 源碼分析原因

對 element 組件進行 debug 時,可以直接引入相關組件的源碼

import ElPopover from 'element-ui/packages/popover';export default {  components: {    CheckboxFilter,    ElPopover  },  ...}

然后我們就可以在node_modules的 element 源碼進行 debug 操作(危險步驟,debug 后需要復原)。

// node_modules/element-ui/packages/popover/src/main.vuemounted() {  ...  if (this.trigger === 'click') {   on(reference, 'click', this.doToggle);   on(document, 'click', this.handleDocumentClick);  } else if (this.trigger === 'hover') {   ...  } else if (this.trigger === 'focus') {   ...  }}

popover 在 mounted 鉤子內初始化了trigger='click'的事件綁定,on(document, 'click', this.handleDocumentClick)這里綁定了 document 很可能就是阻止事件冒泡后不能觸發外部點擊隱藏的判斷邏輯。

// node_modules/element-ui/packages/popover/src/main.vuehandleDocumentClick(e) { let reference = this.reference || this.$refs.reference; const popper = this.popper || this.$refs.popper; if (!reference && this.$slots.reference && this.$slots.reference[0]) {  reference = this.referenceElm = this.$slots.reference[0].elm; } if (!this.$el ||  !reference ||  this.$el.contains(e.target) ||  reference.contains(e.target) ||  !popper ||  popper.contains(e.target)) return; this.showPopper = false;},

這里判斷this.$el是否包含 click 的 target,從而是否觸發this.showPopper = false,當菜單欄阻止事件冒泡后 document 不能監聽到 click 事件,才會無法進行外部點擊隱藏的判斷邏輯。

延伸v-clickoutside

element 的 select 組件中用到了 v-clickoutside 自定義指令,作用和 popover 的 handleDocumentClick 差不多(倒不如說 handleDocumentClick 是特殊的 clickoutside)

在上面的問題中,我們單獨把 v-clickoutside 抽出來使用確實可以的,這是為什么呢?

// node_modules/element-ui/packages/popover/src/utils/clickoutside.js!Vue.prototype.$isServer && on(document, 'mousedown', e => (startClick = e));!Vue.prototype.$isServer && on(document, 'mouseup', e => { nodeList.forEach(node => node[ctx].documentHandler(e, startClick));});

答案是 v-clickoutside 使用鼠標事件判斷的,所以 click 的 阻止冒泡不會讓 clickoutside 無效。

總結

解決 bug 的過程中需要做到不產生額外的 bug,并且深入分析問題的原因有助于能力的提高。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美午夜性色大片在线观看| 精品日韩视频在线观看| 国产精品精品视频| 国产欧美婷婷中文| 国产精品高清网站| 韩日精品中文字幕| 色青青草原桃花久久综合| 国内精品免费午夜毛片| 久久久久国色av免费观看性色| 国产精品极品美女粉嫩高清在线| 欧美高清在线视频观看不卡| 精品国产户外野外| 国产极品jizzhd欧美| 亚洲韩国欧洲国产日产av| 国产一区二区欧美日韩| 久久久精品欧美| 日韩精品在线视频观看| 亚洲xxxxx| 久久免费精品视频| 国产成人短视频| 高跟丝袜欧美一区| 啪一啪鲁一鲁2019在线视频| 久久久久久久久久久久久久久久久久av| 久久黄色av网站| 日韩精品视频在线播放| 欧美噜噜久久久xxx| 欧美午夜性色大片在线观看| 欧美日韩成人在线观看| 97久久精品人人澡人人爽缅北| 精品久久久久人成| 久久久综合免费视频| 成人免费午夜电影| 亚洲国产又黄又爽女人高潮的| 中文国产亚洲喷潮| 91精品国产乱码久久久久久蜜臀| 国产成人精品网站| 国产精品99久久久久久www| 成人中文字幕+乱码+中文字幕| 亚洲男子天堂网| 国产一区二区三区高清在线观看| 久久视频免费在线播放| 91性高湖久久久久久久久_久久99| 亚洲精品国产精品国自产观看浪潮| 疯狂做受xxxx欧美肥白少妇| 一个人看的www欧美| 欧美夫妻性生活xx| 欧美激情视频网| 日韩精品极品毛片系列视频| 高清欧美性猛交xxxx| 国产一区红桃视频| 4438全国成人免费| 精品女厕一区二区三区| 欧美肥臀大乳一区二区免费视频| 奇米成人av国产一区二区三区| 国产精品久久久久久搜索| 欧美整片在线观看| 中文字幕精品在线| 国产精品69精品一区二区三区| 亚洲一区www| 久久久伊人欧美| 久久久久久国产| 亚洲第一中文字幕在线观看| 永久免费看mv网站入口亚洲| 一本色道久久88精品综合| 国产日韩欧美夫妻视频在线观看| 亚洲一区二区三区久久| 国产一区二区三区日韩欧美| 日韩精品福利在线| 中文字幕最新精品| 成人免费在线视频网址| 欧美成人一区二区三区电影| 国产丝袜精品视频| 日韩精品在线观看网站| 国产成人aa精品一区在线播放| 伦伦影院午夜日韩欧美限制| 欧美老女人bb| 国产视频精品免费播放| 91久久精品一区| 亚洲深夜福利视频| 久久久免费高清电视剧观看| 欧美午夜影院在线视频| 成人在线播放av| 国产欧美亚洲精品| 国产午夜精品理论片a级探花| 亚洲欧美激情另类校园| www高清在线视频日韩欧美| 国产丝袜一区二区三区免费视频| 欧美日韩高清区| 久久av资源网站| 色妞在线综合亚洲欧美| 色妞久久福利网| 国产一区二区动漫| 亚洲伊人第一页| 欧美午夜视频一区二区| 欧美黑人性视频| 久久免费观看视频| 国产成人在线一区| 日韩有码在线观看| 国产亚洲综合久久| 人人做人人澡人人爽欧美| 亚洲大尺度美女在线| www.xxxx精品| 亚洲视频在线看| 日韩欧美主播在线| 亚洲最大中文字幕| 欧美日本精品在线| 精品久久久久久中文字幕| 久久五月天色综合| www.欧美免费| 免费91麻豆精品国产自产在线观看| 亚洲第一福利在线观看| 国产偷国产偷亚洲清高网站| 欧美夫妻性生活xx| 午夜精品久久17c| 成人激情视频在线播放| 午夜剧场成人观在线视频免费观看| 久久久久久久久久久av| 蜜月aⅴ免费一区二区三区| 久久夜色撩人精品| 92看片淫黄大片欧美看国产片| 亚洲男人天堂2024| 亚洲免费视频在线观看| 欧美电影电视剧在线观看| 欧美成人手机在线| 国产精品日韩久久久久| 亚洲国产天堂网精品网站| 亚洲国产精品成人一区二区| 亚洲国产成人久久| 久久精品99久久香蕉国产色戒| 亚洲欧美在线播放| 欧美性xxxx极品hd欧美风情| 在线视频日本亚洲性| 成人伊人精品色xxxx视频| 日韩美女视频中文字幕| 久久综合网hezyo| 国产精品午夜国产小视频| 亚洲第一综合天堂另类专| 国产在线视频一区| 青草青草久热精品视频在线网站| 国产精品专区一| 亚洲成人亚洲激情| 欧美三级免费观看| 久久久国产视频| 日韩国产欧美精品一区二区三区| 国产精品ⅴa在线观看h| 亚洲一区二区三区久久| 日韩成人在线视频| 中文字幕日韩精品在线观看| 欧美电影免费看| 亚洲第一精品久久忘忧草社区| 国产精品久久久久91| 91av在线影院| 亚洲欧美国产精品专区久久| 日韩在线视频免费观看高清中文| 亚洲精品在线观看www| 国产精品爱啪在线线免费观看| 中文字幕亚洲第一| 中文字幕日韩欧美精品在线观看| 亚洲成人网在线观看| 久久久久亚洲精品国产| 粉嫩av一区二区三区免费野| 中文字幕亚洲专区| 欧美大人香蕉在线| 欧美丰满片xxx777|