Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS中通过事件传播的popover_Javascript_Events_Dom - Fatal编程技术网

Javascript JS中通过事件传播的popover

Javascript JS中通过事件传播的popover,javascript,events,dom,Javascript,Events,Dom,我试图在React中创建一个popover(尽管我不认为它是React特有的)。要关闭popover,请单击外部,我将向document.body添加一个单击事件侦听器,它将关闭popover,并向popover的最顶端节点添加另一个事件侦听器,它将停止事件传播(因此它不会到达正文) 我的代码是否有错误,或者我的方法是否完全不正确?我看到的是(如果我没有关闭popover),body事件首先被触发,然后popover click事件被触发 var Popover = React.createCl

我试图在React中创建一个popover(尽管我不认为它是React特有的)。要关闭popover,请单击外部,我将向
document.body
添加一个单击事件侦听器,它将关闭popover,并向popover的最顶端节点添加另一个事件侦听器,它将停止事件传播(因此它不会到达正文)

我的代码是否有错误,或者我的方法是否完全不正确?我看到的是(如果我没有关闭popover),body事件首先被触发,然后popover click事件被触发

var Popover = React.createClass({
    componentWillMount() {
        document.body.addEventListener('click', this.handleDocumentClick);
    },
    componentWillUnmount() {
        document.body.removeEventListener('click', this.handleDocumentClick);
    },
    handleDocumentClick(e) {
        console.log('triggered from document document', e);
        this.props.onClose();
    },
    handleSelfClick(e) {
        console.log('triggered from popover', e);
        e.preventDefault();
        e.stopPropagation();
    },
    render() {
        var { top, left, width } = this.props;

        return (
            <div key={ `${top}:${left}` } className='popover top' style={{ top, left, width }} onClick={ this.handleSelfClick }>
                <div className='popover-arrow-top' style={{ left }} />
                <div className='popover-content'>
                    { this.props.children }
                </div>
            </div>
        );
    }
});

试试看
document.addEventListener
而不是运气不好。不过现在已经修好了。无论如何谢谢你!
componentWillMount() {
    document.addEventListener('click', this.handleDocumentClick);
},
componentWillUnmount() {
    document.removeEventListener('click', this.handleDocumentClick);
},
handleDocumentClick(e) {
    var self = this.getDOMNode();
    var { onClose } = this.props;

    (function searchParent (currentTarget) {
        if (!currentTarget) {
            onClose(); // Clicked body
        } else if (currentTarget !== self) {
            searchParent(currentTarget.parentNode);
        } // else was in popover, stop iteration
    })(e.target);
}, ...