javascript - 无法在 textarea 中自动输入文本
问题描述
这是一个相当长的问题,因为我试图包含尽可能多的细节。如果您想跳到实际问题,请参阅最后一段。
我正在尝试编写一个机器人来接受命令来/r 1d20+2
掷骰子,评估,并在网站streamyard.com上的聊天框中以Javascript发送响应(因为这就是我的DM用来流式传输D&D)。
我遇到的问题是在 textarea 字段中“输入”。这是页面上聊天框的 HTML:
<div class="Chat__Wrap-eYhJOs AJLtK">
<ul class="Chat__Comments-dUewnW eqLtEG">
<li class="Comment_Wrap-lbwIWt klCgOs">
<div class="Comment_TextWrap-hSuVQ gHYXCH">
<p class="Text__StyledText-guhEiE bLDoWl" color="default">test</p>
</div>
</li>
</ul>
<form class="ChatInput__Form-eqBCnG iHgCda">
<div class="ChatInput__InputWithSmallGutter-fOaQzB dEaxxd Input__Wrap-kXBxwI iUPDqt">
<label>
<textarea class="sc-bdVaJa eFZRmf"></textarea>
</label>
</div>
<button class="Button_Wrap-ivpgWU dSirvr ButtonBase__WrapperButton-bsASeg cylsQk" type="submit" color="primary">
<span class="Button__InnerSpan-iZsIhM jVWFud">Send</span>
</button>
</form>
</div>
我可以通过以下方式处理文本区域:
var textbox = document.getElementsByClassName("sc-bdVaJa eFZRmf")[1];
我可以使用以下内容将文本插入其中:
textbox.value = 'test';
textbox.innerText = 'test';
这会导致 textarea 显示输入的值(在本例中为“test”)(特别是textbox.value
命令执行此操作)。但是,当我使用以下命令“发送”消息时:
var button = document.getElementsByClassName("Button__Wrap-ivpgWU dSirvr ButtonBase__WrapperButton-bsASeg cylsQk");
button[1].click();
它不会发送我“键入”的聊天消息。它什么也不发送,甚至不会像单击按钮一样清除文本区域。此外,如果我手动单击按钮,也会发生同样的事情。现在,如果我手动单击文本区域并在其中输入任何内容,例如在我以编程方式插入其中的文本后添加一个空格,然后执行上面的代码以单击按钮,它将发送消息。
所以,这让我觉得当键盘按下一个按钮时它正在检测到一些东西,而我只是通过设置 textarea 值来解决这个问题。经过一些谷歌搜索,我发现了触发onchange
事件。所以,我尝试了以下方法:
if ("createEvent" in document) {
var evt = document.createEvent("HTMLEvents");
evt.initEvent("change", false, true);
textbox.dispatchEvent(evt);
}
else {
textbox.fireEvent("onchange");
}
但是,这只会导致与以前相同。我还尝试使用如下代码模拟 textarea 中的按键:
textbox.dispatchEvent(new KeyboardEvent('keypress', {'key': 'a'}));
但是,这似乎也不起作用,因为“发送”按钮似乎不起作用(并且 textarea 似乎没有填充指定的“a”键)。但是再一次,如果我要在框中手动输入内容,“发送”按钮现在可以工作,因为它检测到正在输入内容。我还尝试动态导入 jQuery 并使用 jQuery 来模拟按键,如下所示:
var e1 = jQuery.Event("keydown");
e1.which = 97;
$('textarea.sc-bdVaJa').last().trigger(e1);
var e2 = jQuery.Event("keyup");
e2.which = 97;
$('textarea.sc-bdVaJa').last().trigger(e2);
但这只是导致与上面相同,'a'(十进制 97)没有出现在 textarea 中,“发送”按钮也没有工作。
我认为这是这个小项目中最简单的部分之一,将一串文本发送到文本区域,结果比我想象的要困难得多。我正在寻找的是,如何让网页注册新文本已输入到文本区域,以便我可以“单击”按钮并将文本发送到聊天室?
解决方案
虽然这并不能直接解决问题,但这是我为使其正常工作所做的。我没有使用网页上的文本区域和发送按钮,而是决定去掉中间人并查看发布帖子时发送的网络流量。然后我使用 JavaScript 向服务器发送一个类似的请求,它成功地发布了消息。我是这样做的。
var xhttp = new XMLHttpRequest();
xhttp.open("POST", "/api/broadcasts/dug95avkgq/chat", true);
xhttp.setRequestHeader("content-type", "application/json");
xhttp.send('{"text":"<MESSAGE>","name":"<USERNAME>","clientId":"<ID>","color":"#22653f","csrfToken":"<TOKEN>"}');
推荐阅读
- linphone - 丢失:bitbake 中的 PYTHON_EXECUTABLE
- aws-java-sdk-2.x - AWS Java SDK 2.x Elasticsearch 签名在包含 Unicode 的长文本上不匹配
- python - OpenCV2 Python 和 time.sleep() - 无法正确使用 time.sleep()
- ios - 通过 BLE 将图片从我的手机 (iOS) 发送到 Surface Pro (Windows 10)
- java - 无法为 ZIP 文件中的 .xls 文件创建 HSSFWorkbook 工作簿
- java - 通过代理的新套接字连接
- jdbc - Cassandra 是否有开源的 JDBC 驱动程序?
- powershell - 从远程用户获取网络打印机,变量可以在路径中使用吗?
- sql - 显示继续日期 -SQL
- javascript - 无法从 json 查询中获取字段