利用contains方法實現:點擊界面空白部分關閉當前面板

来源:http://www.cnblogs.com/jiangyangjing/archive/2017/10/16/7678430.html
-Advertisement-
Play Games

今天給組件添加一個小功能,需要點擊界面空白部分關閉當前組件,找了好一會兒,發現主要是jquery的方法,js原生幾乎沒有,崩潰。。好不容易弄出來了,就給自己做個筆記吧,ps:我用的react 要用到的方法: 1.contains:就是判斷某個元素是不是選定元素的子元素(或本身); 鏈接:https: ...


今天給組件添加一個小功能,需要點擊界面空白部分關閉當前組件,找了好一會兒,發現主要是jquery的方法,js原生幾乎沒有,崩潰。。好不容易弄出來了,就給自己做個筆記吧,ps:我用的react

 

要用到的方法:

1.contains:就是判斷某個元素是不是選定元素的子元素(或本身);

鏈接:https://www.w3schools.com/Jsref/met_node_contains.asp

2.window.event.target:返回事件的目標節點,比如你點擊了某個<h1></h1>,它就返回這個h1;(萬惡的ie不支持)

鏈接:http://www.w3school.com.cn/jsref/event_target.asp

3.addEventListener:事件監聽,示例,document.body.addEventListener('click',function(){ });

 鏈接:http://www.runoob.com/jsref/met-element-addeventlistener.html

4.ref,這個是react提供的選擇真實dom元素的方法,和js原生的document.document.getelementby...系列作用一樣

示例:
<div

ref={(r) => {
this.divElem = r;
}}
>
</div>

上面是es6的用法,es5(不推薦)看這裡: http://www.runoob.com/react/react-refs.html

 

廢話說完,上圖上代碼:

效果圖:

代碼:

import React, { Component } from 'react';
import './index.less';

class CloseTheDomByClickBlankArea extends Component {
state = {
openCurrentArea: true,
};

componentDidMount() {
// 點擊blank_area區域,關閉current_area面板
this.blankAreaElem.addEventListener('click',
  this.handleClickCloseCurrentArea.bind(this));
}

handleClickCloseCurrentArea() {
// 當界面上渲染出內部面板時,可執行如下操作(若無此判斷條件,點擊打開面板按鈕區域,
    就會先觸發如下操作,再觸發handleClickOpenCurrentArea函數)
if (document.body.contains(this.currentAreaElem)) {
// 點擊面板以外的部分(灰色區域以內,面板區域以外),就關閉面板
if (this.blankAreaElem.contains(window.event.target)
     && !this.currentAreaElem.contains(window.event.target)
    ) {
this.setState({
openCurrentArea: false,
})
}
}
}

// 點擊"打開面板"按鈕,打開面板
handleClickOpenCurrentArea() {
this.setState({
openCurrentArea: true,
})
}

render() {
return (
<div
className="blank_area"
ref={(r) => {
this.blankAreaElem = r;
}}
>

    {/* 打開面板按鈕 */}
<a
role="button"
tabIndex="0"
className="btn_open_current_area"
onClick={this.handleClickOpenCurrentArea.bind(this)}
>
<p className="btn_open_current_area_text">打開面板</p>
</a>

   
      {/* 要關閉或開啟的面板current_area */}
        {
this.state.openCurrentArea
&&
<div
className="current_area"
ref={(r) => {
this.currentAreaElem = r;
}}
>
<p className="current_area_text">點擊旁邊灰色區域關閉當前面板</p>
</div>
}
</div>
);
}
}

export default CloseTheDomByClickBlankArea;

 

GitHub項目鏈接:https://github.com/AbrahamJiang/my-react-demos

本文代碼在src下CloseTheDomByClickBlankContain/中。



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ...
  • 下麵舉例14道前端面試題選擇題(摘自妙味課堂) 1、 選項:A、object B、array C、arguments D、undefined 解析:arguments即是實參的集合,又稱類數組對象。他的類型是對象object。因此選A。 2、 選項:A、number B、undefined C、fu ...
  • <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"><!--編碼--> <title>我的第一個網頁(題目)</title></head><body><p>你們好!這是我的第一個網頁,歡迎你們的訪問。<br/>這裡用b r換行</p ...
  • 一、box-shadow的參數解析 此處參考http://blog.csdn.net/baidu_31345523/article/details/50264869 二、box-shadow應用 在說明我們這個應用之前,先給大家推薦一個網站http://www.css88.com/tool/css3 ...
  • 謝琳·伍德蕾(Shailene Woodley) 和 提奧·詹姆斯(Theo James) 謝琳·伍德蕾(Shailene Woodley),1991年11月15日出生於美國加州,美國影視演員。 五歲就被星探發掘,2002年開始,她在《尋人密探組》、《橘子郡男孩》等劇中頻繁的出鏡,2005年她出演了 ...
  • 通過上一篇文章 "我的three.js學習記錄(一)" 基本上是入門了three.js,但是這不夠3D,這次我希望能把之前做的demo弄出來,然後通過例子來分析操作步驟。 1. 示例 上圖是之前做的一個demo,有點醜,希望不要介意。 這個主要是外面一層包裹著 "天空盒" , 然後裡面是一個由開頂的 ...
  • 今天看了技術大牛的博客,於是想跟蹤學習有關他發表的文章,發現必須要註冊一個博客才能關註,於是就加入了博客園,註冊了一個博客。希望通過博客的平臺記錄自己每天學到的新技術,也可以分享一些自己的心得。 ...
  • es7
    es7 es7只有兩個新特性: 1. Array.prototype.includes() 用於判斷元素是否在數組內 用法: 其實, 和`Array.prototype.indexOf() 1`大致相同,但有幾點不同: 1. includes可以檢測出NaN,而indexOf不可以 [1,NaN]. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...