js的事件冒泡和點擊其他區域隱藏彈出層


一、前言

  在編寫頁面的時候,我們經常使用到彈出層。對於彈出層,原本的意義就是增加與用戶的交互,提升用戶的好感度。如果彈出層都沒有較好的體驗,那何談通過交互來提升好感。。。

  首先提出幾個彈出層的注意點:

  • 彈出層的界面需要統一,不一致的彈出層並不能增加美感,相反還會顯得頁面布局更加雜亂無章;
  • 彈出層的設計一定要好看,按鈕要符合項目的主色調;
  • 彈出層的寬度固定屏幕占比,設置max-width,高度根據內容自適應;
  • 點擊其他區域隱藏彈出層。。。

二、正文

  今天,主要說說點擊其他區域隱藏彈出層。筆者被這個效果折磨了很久,幾乎每次實現這個效果都要查一遍資料,一次次嘗試才能達到想要的效果。如此麻煩,皆是因為對事件冒泡的理解不夠已經錯誤處理。

  什么是事件冒泡?為什么要使用它?

  事件冒泡:由最具體的元素接收(當前節點),然后逐級向上傳播至最不具體的元素的節點(document);

  在實現點擊其他區域隱藏彈出層時,需要對document綁定點擊事件,而事件冒泡會使點擊其它節點時仍然觸發該事件,從而造成事件沖突,導致該顯示彈出層時顯示不出,不該隱藏時卻又隱藏了彈出層。

<style type="text/css"> .layer-container{ position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); display: flex; justify-content; center; align-items: center; display: none;
    } .layer-main{ width: 75%; padding: 20px; max-width: 400px;
    }
</style>

<body>
<button>顯示彈出層</button>

<div class="layer-container">
    <div class="layer-main">
         <div class="layer-header"></div>
         <div class="layer-content"></div>
         <div class="layer-footer">
             <div class="layer-button">確認</div>
        </div>
    </div>
</div>

<script>
    //點擊按鈕,顯示彈出層
 $("button").bind("click", function(){ $(".layer-container").css("display", "flex"); event.stopPropagation();//==========阻止冒泡1
 }) //點擊其他區域,隱藏彈出層
 $(document).bind("click", function(){ $(".layer-container").css("display", "none"); }) //點擊彈出層內確認按鈕
 $(".layer-button").bind("click", function(){ console.log("點擊了確認按鈕") }) //給彈出層綁定點擊事件,阻止冒泡
 $(".layer-main").bind("click", function(){ event.stopPropagation();//==========阻止冒泡2
 }) </script>
</body>

說明:

  • $(document)即給整個文檔綁定點擊事件,點擊則隱藏彈出層container;
  • $("button")給按鈕綁定點擊事件,點擊即顯示彈出層container;
    此處必須加event.stopPropagation()阻止冒泡,否則先執行button的事件顯示彈出層container,又向上冒泡執行document事件隱藏彈出層container,導致最終點擊沒有效果;
  • $(".layer-main")給彈出層main綁定點擊事件,點擊它或冒泡到它時,即阻止繼續冒泡到document;
    此處的點擊事件以及阻止冒泡必須加,否則點擊彈出層main或里面的其他節點,都會冒泡到document,從而隱藏彈出層container,導致事件紊亂。

 

 其實,還可以通過事件的目標(event.target)來識別當前點擊的節點,從而進行接下來的操作,比如對指定的節點的特殊操作

==>>除指定區域外點擊任何區域都隱藏div

$('body').click(function(e) { var target = $(e.target); // 如果#layer或者#btn下面還有子元素,可使用
    // !target.is('#btn *') && !target.is('#layer *')
    if(!target.is('#btn') && !target.is('#layer')) { if ( $('#layer').is(':visible') ) { $('#layer').hide(); } } }); $('body').click(function(e) { if(e.target.id != 'btn' && e.target.id != 'overlay') if ( $('#layer').is(':visible') ) { $('#layer').hide(); } })

 

三、結語

拜拜!

 

  


免責聲明!

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



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