强制React通过注入JavaScript来触发事件

时间:2015-05-09 22:34:16

标签: javascript jquery reactjs

我想做什么

我目前正在为Web-Whatsapp写一个小聊天机器人。由于简单的js注射,我决定使用镀铬扩展。有一个语音留言按钮,可以在您开始输入内容时切换到发送文本的按钮。 React删除语音邮件元素并呈现发送按钮。

问题

这整个过程都是事件驱动的。我正在通过DOM设置Text,它不会触发react事件。我试图模拟一个按键,但似乎chrome的v8禁用了出于安全原因模拟按键的所有方法。我也试图稍微操纵HTML,但在我对Elements进行更改后反应停止了。我也尝试了jQuery函数,但这也不起作用。

对没有帮助的事情的引用:

  

Keydown Simulation in Chrome fires normally but not the correct key

     

https://api.jquery.com/keypress/

问题

有没有办法强制React解雇这个事件?或者任何形式的解决方法?

5 个答案:

答案 0 :(得分:3)

<强> “解决方案” 经过两天的研究,我不得不承认,出于安全考虑,我在尝试这种方式时显然不可能。如果你遇到像我这样的情况,你不应该浪费时间去解决这个问题,而不是仅仅寻找一个好的解决方法。如果我弄清楚的话,我会在这里更新我的WebWhatsapp-bot。

答案 1 :(得分:1)

使用以下库

1。https://github.com/dwachss/bililiteRange/blob/master/bililiteRange.js 2。https://github.com/dwachss/bililiteRange/blob/master/jquery.sendkeys.js

按照以下顺序在Chrome控制台中加载(粘贴到控制台中)这个js脚本

1.load jquery.js

2.load bililiteRange.js

3.load jquery.sendkeys.js

现在您可以将文本发送到Whatsapp输入框,如下例所示:

var input_op=jQuery("#main div.pluggable-input-body.copyable-text.selectable-text");
input_op.sendkeys("hello");

用于激发发送按钮上的Click事件:

function triggerMouseEvent(node, eventType) {

    var clickEvent = document.createEvent('MouseEvents');
    clickEvent.initEvent(eventType, true, true);
    node.dispatchEvent(clickEvent);
}

var d = document.querySelector("#main span[data-icon="send"]");
triggerMouseEvent(d, "click"); //stimulate mouse event in chrome

完成

答案 2 :(得分:0)

Chrome不允许任何页面模拟按键,但您可以使用外部应用程序执行此操作。 Java是最好的东西。从您的页面请求服务器请求Java应用程序为您执行按键操作。 chrome不会阻止Java中机器人类的按键。 Here是一个视频,显示机器人类在网页中键入文本。如果您愿意,我可以帮助您使用Java(Processing)。

答案 3 :(得分:0)

过去,当我需要尝试从Javascript允许的高级别模拟按键时,我从辉煌的gremlins.js中汲取灵感。他们将 typer gremlins输入的方式如下(取自src/species/typer.js):

// Create a generic event
var myEvent = document.createEventObject ?
    document.createEventObject() :
    document.createEvent("Events");

// 'init' the event as a keypress
myEvent.initEvent('keypress', true, true);

// Fill in details
myEvent.keyCode = key;
myEvent.which = key;
myEvent.keyCodeVal = key;

// Fire it on your target
targetElement.dispatchEvent ?
    targetElement.dispatchEvent(myEvent) :
    targetElement.fireEvent('on' + eventType, myEvent);

它非常偷偷摸摸,过去对我有一些限制,你可以尝试一下。

答案 4 :(得分:0)

在插入文本后立即尝试以下两种操作:

  1. 围绕您输入的文本创建一个范围,然后:

range.startContainer.dispatchEvent(new Event('input',{bubble:true,cancelable:false})))

  1. document.dispatchEvent(new MouseEvent('mouseup',{气泡:真,可取消:真})));