1. 程式人生 > 實用技巧 >頁面彈出一個彈框後 點選除彈框外的其他地方 讓彈框消失

頁面彈出一個彈框後 點選除彈框外的其他地方 讓彈框消失

封裝的一個方法:點選當前元素,逐級篩選其父元素是否包含某個類,如果有包含,返回true,如果沒有包含,返回false;

 1     function fnEnumParentNodes(currNode, givenClassName) {
 2         if (!currNode || !givenClassName) {//currNode 是當前點選的元素,givenClassName是基準類名(我們想去篩選是否有這個類名)
 3             return false;
 4         };
 5         let parentNode, flag = false
; 6 while (parentNode = currNode.parentNode || currNode.parentElement) { 7 let classArr = parentNode.classList && Array.from(parentNode.classList); 8 if (classArr && classArr.includes(givenClassName)) { 9 flag = true; 10 break
; 11 } 12 currNode = parentNode; 13 } 14 return flag; 15 }

遇到的問題:

當選中這個彈框的內容時,彈框消失了。(本應該點選彈框以外的地方,彈框消失,但是滑鼠選中彈框內容,觸發了點選事件,並且e.target是彈框最外層的元素)。

原因:

封裝的方法有點問題。while語句中判斷的是當前元素的父元素,並逐級遞增,忽略了當前元素本身。

修改如下:

 1      function fnEnumParentNodes(currNode, givenClassName) {
2 if (!currNode || !givenClassName) { 3 return false; 4 }; 5 let flag = false; 6 while (currNode) {//這裡是修改邏輯點!!! 7 let classArr = currNode.classList && Array.from(currNode.classList); 8 if (classArr && classArr.includes(givenClassName)) { 9 flag = true; 10 break; 11 } 12 currNode = currNode.parentNode || currNode.parentElement; 13 } 14 return flag; 15 }

問題就解決啦。