Simulate click event on react element

后端 未结 7 1926
孤独总比滥情好
孤独总比滥情好 2020-12-03 03:06

I\'m trying to simulate a .click() event on a React element but I can\'t figure out why it is not working (It\'s not reacting when I\'m firing the

相关标签:
7条回答
  • 2020-12-03 03:30

    A slight adjustment to @carlin.scott's great answer which simulates a mousedown, mouseup and click, just as happens during a real mouse click (otherwise React doesn't detect it).

    This answer adds a slight pause between the mousedown and mouseup events for extra realism, and puts the events in the correct order (click fires last). The pause makes it asynchronous, which may be undesirable (hence why I didn't just suggest an edit to @carlin.scott's answer).

    async function simulateMouseClick(el) {
      let opts = {view: window, bubbles: true, cancelable: true, buttons: 1};
      el.dispatchEvent(new MouseEvent("mousedown", opts));
      await new Promise(r => setTimeout(r, 50));
      el.dispatchEvent(new MouseEvent("mouseup", opts));
      el.dispatchEvent(new MouseEvent("click", opts));
    }
    

    Usage example:

    let btn = document.querySelector("div[aria-label=start]");
    await simulateMouseClick(btn);
    console.log("The button has been clicked.");
    
    0 讨论(0)
  • 2020-12-03 03:33

    With react 16.8 I would do it like this :

    const Example = () => {
      const inputRef = React.useRef(null)
            
      return (
        <div ref={inputRef} onClick={()=> console.log('clicked')}>
          hello
        </div>
      )
    }
        
    

    And simply call

    inputRef.current.click()
    
    0 讨论(0)
  • 2020-12-03 03:33

    If you don't define a class in your component, and instead you only declare:

    function App() { ... }
    

    In this case you only need to set up the useRef hook and use it to point/refer to any html element and then use the reference to trigger regular dom-events.

    import React, { useRef } from 'react';
    
    function App() {
      const inputNameRef = useRef()
      const buttonNameRef = useRef()
      
      function handleKeyDown(event) {
        // This function runs when typing within the input text,
        // but will advance as desired only when Enter is pressed
        if (event.key === 'Enter') {
          // Here's exactly how you reference the button and trigger click() event,
          // using ref "buttonNameRef", even manipulate innerHTML attribute
          // (see the use of "current" property)
          buttonNameRef.current.click()
          buttonNameRef.current.innerHTML = ">>> I was forced to click!!"
        }
      }
      
      function handleButtonClick() {
        console.log('button click event triggered')
      }
      
      return (
        <div>
          <input ref={inputNameRef} type="text" onKeyDown={handleKeyDown}  autoFocus />
          <button ref={buttonNameRef} onClick={handleButtonClick}>
          Click me</button>
        </div>
      )
    }
    
    export default App;
    
    0 讨论(0)
  • 2020-12-03 03:38

    Use refs to get the element in the callback function and trigger a click using click() function.

    class Example extends React.Component{
      simulateClick(e) {
        e.click()
      }
      render(){
        return <div className="UFIInputContainer"
        ref={this.simulateClick} onClick={()=> console.log('clicked')}>
          hello
          </div>
      }
    }
    
    ReactDOM.render(<Example/>, document.getElementById('app'))
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    <div id="app"></div>

    0 讨论(0)
  • 2020-12-03 03:47

    Using React useRef Hooks you can trigger a click event on any button like this:

    export default const () => {
    
        // Defining the ref constant variable
        const inputRef = React.useRef(null);
    
        // example use
        const keyboardEvent = () => {
          inputRef.current.handleClick(); //Trigger click
        }
    
        // registering the ref
        return (
           <div ref={inputRef} onClick={()=> console.log('clicked')}>
              hello
           </div>
        )
    }
    
    0 讨论(0)
  • 2020-12-03 03:52

    Inspired from previous solution and using some javascript code injection it is also possibile to first inject React into the page, and then to fire a click event on that page elements.

    let injc=(src,cbk) => { let script = document.createElement('script');script.src = src;document.getElementsByTagName('head')[0].appendChild(script);script.onload=()=>cbk() }
    injc("https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js",() => injc("https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js",() => {
    
    class ReactInjected extends React.Component{
      simulateClick(e) {
        e.click()
      }
      render(){
        return <div className="UFIInputContainer"
        ref={this.simulateClick} onClick={()=> console.log('click injection')}>
          hello
          </div>
      }
    }
    ReactDOM.render(<ReactInjected/>, document.getElementById('app'))
    
    } ))
    <div id="app"></div>

    0 讨论(0)
提交回复
热议问题