<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        前端中如何阻止事件傳播

        來源:懂視網 責編:小采 時間:2020-11-27 19:47:14
        文檔

        前端中如何阻止事件傳播

        前端中如何阻止事件傳播:這次給大家帶來前端中如何阻止事件傳播,前端中阻止事件傳播的注意事項有哪些,下面就是實戰案例,一起來看一下。做一個小demo,點擊按鈕出現浮層,點擊其它地方關閉浮層,寫一個簡單css<style> .wrapper{ position:relative; displ
        推薦度:
        導讀前端中如何阻止事件傳播:這次給大家帶來前端中如何阻止事件傳播,前端中阻止事件傳播的注意事項有哪些,下面就是實戰案例,一起來看一下。做一個小demo,點擊按鈕出現浮層,點擊其它地方關閉浮層,寫一個簡單css<style> .wrapper{ position:relative; displ

        這次給大家帶來前端中如何阻止事件傳播,前端中阻止事件傳播的注意事項有哪些,下面就是實戰案例,一起來看一下。

        做一個小demo,點擊按鈕出現浮層,點擊其它地方關閉浮層,寫一個簡單css

        <style>
        .wrapper{
         position:relative;
         display:inline-block;
        }
        .popover{
         position:absolute;
         border:1px solid red;
         left:100%;
         top:0;
         padding:10px;
         margin-left:10px;
         background:white;
         display: none; /*默認隱藏*/
        }
        .popover::before{
         position:absolute;
         content:'';
         top:5px;
         right:100%;
         border:10px solid transparent;
         border-right-color:red;
        }
        .popover::after{
         position:absolute;
         content:'';
         top:5px;
         right:100%;
         border:10px solid transparent;
         border-right-color:white;
         margin-right:-1px;
        }
        
        </style>
        <p id="wrapper" class='wrapper'>
         <button id="clickMe">點我</button>
         <p id="popover" class="popover">
         <input type="checkbox">浮層
         </p>
        </p>
        <script>
         clickMe.addEventListener('click',function(){
         popover.style.display = 'block';
         });
        </script>

        那現在我要點擊頁面空白地方關閉呢?該用什么方法,很容易想到監聽文檔,如下代碼

        document.addEventListener('click',function(){
         popover.stely.display = 'none';
        });

        但是實際上這樣寫了之后,按鈕都失效了,怎么點都沒有反應。這是為什么呢?
        理解上一篇講的捕獲和冒泡事件后就很好理解這點了,可以[]()。
        我們沒有指定監聽是在捕獲還是冒泡階段,瀏覽器默認是冒泡階段,當我們點擊按鈕時,捕獲階段沒有發生什么時候,但是冒泡階段就不一樣了,首先button上函數先觸發,然后document上函數也觸發了,導致準備出現的浮層又被隱藏了。
        那你可能要問,button上的事件執行了沒?其實這兩個事件都執行了,只是時間太短,瀏覽器默認一起執行了,可以在里面加一個debugger,就可以看到了。

        clickMe.addEventListener('click',function(){
         popover.style.display = 'block';
        });

        那該怎么解決呢?最簡單的方法是,除了要執行popover.style.display = 'block',還要阻止事件傳播

        clickMe.addEventlistener('click',function(){
         popover.style.display = 'block';
        });
        
        popover.addEventListener('click',function(e){
         e.stopPropagation();
        });

        這里為什么添加在按鈕的父元素上面呢?如果不添加在父元素上面,點擊浮層的時候,浮層也會被關閉。

        如果頁面上有很多監聽器的話,這個方法是比較浪費內存的,比較省內存的方法用JQuery 做

        $(clickMe).on('click',function(){
         $(popover).show();
         $(document).one('click',function(){
         $(popover).hide();
         });
        });
        $(wrapper).on('click',function(e){
         e.stopPropagation(); 
        })

        一開始不監聽,只在popover`show`的時候監聽一次,馬上關掉,這叫做清理戰場。
        $(wrapper).on('click',false) 和下面的代碼完全等價

        $(wrapper).on('click',function(e){
         e.preventDefault(); //阻止默認事件
         e.stopPropagation(); //阻止傳播
        })

        但是如果頁面中有checkbox,你在它的父元素任何一層,包括checkbox自己,添加了組織默認事件那么這個checkbox就沒辦法被check

        這里有個問題,如果沒有阻止事件傳播,向下面這樣,會發生什么事情呢?

        $(clickMe).on('click',function(){
         $(popover).show();
         $(document).one('click',funtion(){
         $(popover).hide();
         });
        });

        當然了,和之前一樣,什么事情也不會發生,那當我點擊按鈕之后里面都發生了那些事情呢?
        當我點擊了按鈕之后,它會做兩件事情,首先把popover`show出來,然后把hide函數添加到document上面,當事件傳播到document`,就會又把它給隱藏了。

        可以給它添加一個setTimeout()函數來解決這個問題

        $(clickMe).on('click',function(){
         $(popover).show();
         setTimeout(function(){
         $(document).one('click',function(){
         $(popover).hide();
         })
         },0)
        });

        setTimeout(fn,0)這個0不是馬上執行,而是盡快執行,具體是在冒泡結束在執行這里的函數,也就是說,當冒泡結束后,在把監聽事件添加到document上面,等待用戶下次點擊在執行。

        總結:

        1. 同時監聽buttondocument,點啥都沒反應,因為兩個函數都執行了,用阻止事件傳播解決了,比較浪費內存

        2. 好一定的方法是用jQuery 做,點擊button后在監聽document,關閉了就不再監聽,不阻止事件傳播,點啥也沒反應,兩種解決方法:一種是阻止事件傳播,另一種是添加一個setTimeout()函數。

        相信看了本文案例你已經掌握了方法,更多精彩請關注Gxl網其它相關文章!

        推薦閱讀:

        React-router v4使用步驟詳解

        Chart.js輕量級圖表庫使用案例解析

        Chart.js 輕量級HTML5圖表繪制工具庫使用步驟詳解

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        前端中如何阻止事件傳播

        前端中如何阻止事件傳播:這次給大家帶來前端中如何阻止事件傳播,前端中阻止事件傳播的注意事項有哪些,下面就是實戰案例,一起來看一下。做一個小demo,點擊按鈕出現浮層,點擊其它地方關閉浮層,寫一個簡單css<style> .wrapper{ position:relative; displ
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 精品一区二区三区高清免费观看| 久久精品国产亚洲AV天海翼| 亚洲色婷婷综合久久| 国产精品亚洲精品日韩已满| 亚洲视频在线观看一区| 久久亚洲国产成人精品性色| 亚洲依依成人亚洲社区| 国产精品九九久久免费视频| 亚洲免费视频网址| 国产男女猛烈无遮挡免费视频网站| 亚洲一区爱区精品无码| 久久av免费天堂小草播放| 国产av无码专区亚洲av桃花庵| 亚洲免费网站在线观看| 国产精品亚洲综合天堂夜夜| 热99RE久久精品这里都是精品免费| 免费大片黄在线观看yw| 久久久久亚洲AV成人网| 久久亚洲国产最新网站| 免费国产成人午夜在线观看| 国产又大又长又粗又硬的免费视频| 亚洲无码在线播放| 亚洲视频在线免费观看| 亚洲第一视频在线观看免费| 亚洲欧洲日产国产最新| 久久精品电影免费动漫| 亚洲精品无码久久久久| 最近中文字幕高清免费中文字幕mv | 在线免费视频你懂的| 亚洲人成网www| 岛国大片免费在线观看| 亚洲av永久无码精品秋霞电影影院| 老司机午夜精品视频在线观看免费| 亚洲一区二区免费视频| 相泽南亚洲一区二区在线播放| 亚洲中文字幕视频国产| 亚洲五月午夜免费在线视频| 久久久亚洲AV波多野结衣 | 四虎永久在线观看免费网站网址| 久久精品国产亚洲AV天海翼| 亚洲AV区无码字幕中文色|