代码之家  ›  专栏  ›  技术社区  ›  Sviat Kuzhelev

反应onCopy事件的preventDefault()不起作用

  •  12
  • Sviat Kuzhelev  · 技术社区  · 7 年前

    我正在尝试找出如何使剪贴板事件返回 false 在onCopy事件上。我用于测试 onCopy 处理程序和 e.preventDefault() 方法但文本复制时不会阻碍缓冲区!我错过了什么?

    提前谢谢你。

    import React from 'react';
    import ReactDOM from 'react-dom';
    import PropTypes from 'prop-types';
    import ReactDOMServer from 'react-dom/server';
    import './index.css';
    
    
    class Copy extends React.Component {
      constructor(props) {
        super(props);
    
        this.state = {
          time: '',
          timer: false,
          counter: 0
        };
    
        this.handlerCopy = this.handlerCopy.bind(this);
      }
    
      handlerCopy(e) {
    
        e.preventDefault(); // must prevent the current event
    
        this.setState(prevState => ({
          counter: prevState.counter + 1
        }));
    
        alert('Don\'t copy it!');
      }
    
      render() {
        return (
          <React.Fragment>
            <p onCopy={this.handlerCopy}>Copy me!</p>
            <p>Copy count: {this.state.counter}</p>
          </React.Fragment>
        );
      }
    }
    
    ReactDOM.render(
    <Copy />,
    document.getElementById('root'));
    
    3 回复  |  直到 7 年前
        1
  •  9
  •   wrrnlim    3 年前

    这真是个好问题!

    这是因为Reacts实际事件监听器也位于文档的根,这意味着click事件已经冒泡到根。您可以使用 e.nativeEvent.stopImmediatePropagation() 阻止其他事件侦听器。

    试试看:

    import React from 'react';
    import ReactDOM from 'react-dom';
    import PropTypes from 'prop-types';
    import ReactDOMServer from 'react-dom/server';
    import './index.css';
    
    
    class Copy extends React.Component {
      constructor(props) {
        super(props);
    
        this.state = {
          time: '',
          timer: false,
          counter: 0
        };
    
        this.handlerCopy = this.handlerCopy.bind(this);
      }
    
      handlerCopy(e) {
        console.log(e.target.innerHTML);
        e.preventDefault();
        e.nativeEvent.stopImmediatePropagation();
    
        this.setState(prevState => ({
          counter: prevState.counter + 1
        }));
    
        alert('Don\'t copy it!');
      }
    
      render() {
        return (
          <React.Fragment>
            <p onCopy={this.handlerCopy}>Copy me!</p>
            <p>Copy count: {this.state.counter}</p>
          </React.Fragment>
        );
      }
    }
    
    ReactDOM.render(
    <Copy />,
    document.getElementById('root'));
    
        2
  •  0
  •   devserkan    7 年前

    这应该是一个评论,但我没有足够的声誉。 我认为e.preventDefault()对于(至少)React 16来说已经足够了。

    Working example on Codesandbox

        3
  •  0
  •   Hemant Nagarkoti    7 年前

    上面提到的解决方案似乎对我不起作用,但如果谈论状态中的计数器值,可以通过以下方式编写handlerCopy(状态值的更新)来正确管理它。

    import React from 'react';
    import ReactDOM from 'react-dom';
    import PropTypes from 'prop-types';
    import ReactDOMServer from 'react-dom/server';
    
    class App extends React.Component {
      constructor(props) {
        super(props);
    
        this.state = {
          time: '',
          timer: false,
          counter: 0
        };
      }
    
       handlerCopy(e) {
        var val = this.state.counter;
        val = val + 1;
        this.setState({
          counter: val
        }, function(){
          console.log('new acounter:- ', this.state.counter);
        })
        alert('Don\'t copy it!');
      }
    
    
      render() {
        return (
          <React.Fragment>
            <p onCopy={(e) => this.handlerCopy(e)}>Copy me!</p>
            <p>Copy count: {this.state.counter}</p>
          </React.Fragment>
        );
      }
    }
    document.addEventListener('click', function(e) {
        console.log('propagation',e)
      }, false);
    
    
    export default App;
    

    上面提到的handlerCopy功能没有对我@Max Wolfen进行任何更改

     handlerCopy(e) {
        console.log(e.target.innerHTML);
        e.preventDefault();
        e.nativeEvent.stopImmediatePropagation();
    
        this.setState(prevState => ({
          counter: prevState.counter + 1
        }));
    
        alert('Don\'t copy it!');
      }