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


封裝的一個方法:點擊當前元素,逐級篩選其父元素是否包含某個類,如果有包含,返回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     }

問題就解決啦。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM