頁面彈出一個彈框後 點選除彈框外的其他地方 讓彈框消失
阿新 • • 發佈:2020-08-06
封裝的一個方法:點選當前元素,逐級篩選其父元素是否包含某個類,如果有包含,返回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 }
問題就解決啦。