要用到的方法:
1.contains:就是判斷某個(gè)元素是不是選定元素的子元素(或本身);
2.window.event.target:返回事件的目標(biāo)節(jié)點(diǎn),比如你點(diǎn)擊了某個(gè)<h1></h1>,它就返回這個(gè)h1;(萬(wàn)惡的ie不支持)
3.addEventListener:事件監(jiān)聽(tīng),示例,document.body.addEventListener('click',function(){ });
4.ref,這個(gè)是react提供的選擇真實(shí)dom元素的方法,和js原生的document.document.getelementby...系列作用一樣
示例:
<p
ref={(r) => {
this.pElem = r;
}}
>
</p>
上面是es6的用法,es5(不推薦)看這里
廢話說(shuō)完,上圖上代碼:
效果圖:
代碼:
import React, { Component } from 'react'; import './index.less'; class CloseTheDomByClickBlankArea extends Component { state = { openCurrentArea: true, }; componentDidMount() { // 點(diǎn)擊blank_area區(qū)域,關(guān)閉current_area面板 this.blankAreaElem.addEventListener('click', this.handleClickCloseCurrentArea.bind(this)); } handleClickCloseCurrentArea() { // 當(dāng)界面上渲染出內(nèi)部面板時(shí),可執(zhí)行如下操作(若無(wú)此判斷條件,點(diǎn)擊打開(kāi)面板按鈕區(qū)域, 就會(huì)先觸發(fā)如下操作,再觸發(fā)handleClickOpenCurrentArea函數(shù)) if (document.body.contains(this.currentAreaElem)) { // 點(diǎn)擊面板以外的部分(灰色區(qū)域以內(nèi),面板區(qū)域以外),就關(guān)閉面板 if (this.blankAreaElem.contains(window.event.target) && !this.currentAreaElem.contains(window.event.target) ) { this.setState({ openCurrentArea: false, }) } } } // 點(diǎn)擊"打開(kāi)面板"按鈕,打開(kāi)面板 handleClickOpenCurrentArea() { this.setState({ openCurrentArea: true, }) } render() { return ( <p className="blank_area" ref={(r) => { this.blankAreaElem = r; }} > {/* 打開(kāi)面板按鈕 */} <a role="button" tabIndex="0" className="btn_open_current_area" onClick={this.handleClickOpenCurrentArea.bind(this)} > <p className="btn_open_current_area_text">打開(kāi)面板</p> </a>
{/* 要關(guān)閉或開(kāi)啟的面板current_area */}
{ this.state.openCurrentArea && <p className="current_area" ref={(r) => { this.currentAreaElem = r; }} > <p className="current_area_text">點(diǎn)擊旁邊灰色區(qū)域關(guān)閉當(dāng)前面板</p> </p> } </p> ); } } export default CloseTheDomByClickBlankArea;
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com