模拟react元素上的点击事件

IT技术 javascript reactjs
2021-03-13 21:41:26

我正在尝试.click() eventReact元素模拟 a但我不知道为什么它不起作用(当我触发 时它没有reactevent)。

我想仅使用 JavaScript 发表 Facebook 评论,但我被困在第一步(.click()div[class="UFIInputContainer"]元素做一个)。

我的代码是:

document.querySelector('div[class="UFIInputContainer"]').click();

这是我尝试执行此操作的 URL:https://www.facebook.com/plugins/feedback.php...

PS 我对 React 没有经验,我真的不知道这在技术上是否可行。这是可能的?

编辑:我正在尝试从Chrome DevTools Console.

6个回答

React 跟踪用于检测鼠标点击mousedownmouseup事件,而不是click像大多数其他事件一样事件。因此,不是click直接调用方法或调度click事件,而是调度 down 和 up 事件。为了更好的衡量,我也发送了click事件,但我认为这对 React 来说是不必要的:

const mouseClickEvents = ['mousedown', 'click', 'mouseup'];
function simulateMouseClick(element){
  mouseClickEvents.forEach(mouseEventType =>
    element.dispatchEvent(
      new MouseEvent(mouseEventType, {
          view: window,
          bubbles: true,
          cancelable: true,
          buttons: 1
      })
    )
  );
}

var element = document.querySelector('div[class="UFIInputContainer"]');
simulateMouseClick(element);

这个答案的灵感来自Selenium Webdriver 代码

这很聪明,谢谢
2021-04-28 21:41:26
似乎不再起作用了,也许我们需要发送一个“更改”事件?
2021-05-02 21:41:26
如果你们能提供开始破坏这个的 React 版本,那可以帮助我解决这个问题的解决方案。
2021-05-06 21:41:26
大多数反应应用程序监听 'mousedown' 事件而不是 'click',所以尝试 mouseClickEvents = ['mousedown']
2021-05-13 21:41:26
这个解决方案在一段时间内效果很好,但最近坏了。您最终找到了替代的 @information_interchange 吗?
2021-05-15 21:41:26

使用 react 16.8 我会这样做:

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

只需调用

inputRef.current.click()
@tam,你的意思是 inputRef.current.handleClick() ??
2021-05-01 21:41:26
当我使用它时,单击一次后,我无法读取 null 的属性单击
2021-05-14 21:41:26
这是 IMO 的最佳答案
2021-05-16 21:41:26
@Gajen 是的。看来我打错了。
2021-05-20 21:41:26
这是正确和最好的解决方案..谢谢..你救了我的一天:)
2021-05-20 21:41:26

用于refs在回调函数中获取元素并使用click()函数触发点击

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>

感谢您的回答,但您将如何将其应用于此 URL:link不能让它工作。
2021-04-20 21:41:26
它应该是 e.target.click()
2021-05-04 21:41:26
这对我不起作用,但是e.props包含映射到元素上的任何函数。在我的例子中,它是一个带有 的复选框onChange,所以在模拟点击中e.props.onChange()工作得很好。
2021-05-07 21:41:26
e.click is not a function
2021-05-14 21:41:26

如果你没有在你的组件中定义一个类,而是你只声明:

function App() { ... }

在这种情况下,您只需要设置useRef钩子并使用它来指向/引用任何 html 元素,然后使用引用来触发常规 dom 事件。

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;

从先前的溶液中使用一些JavaScript代码注入它也是不可能性,首先启发注入 阵营进入页面,然后火在该页面元素click事件。

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>