当前位置: 首页 > 面试题库 >

使用javascript以编程方式填充和提交textarea

乜华翰
2023-03-14
问题内容

我正在尝试使用普通的JS或Jquery自动提交对Steemit帖子的回复。

我使用了以下JavaScript代码,但该按钮保持禁用状态,因此不允许发布回复/评论。

如何模拟文本区域上的keydown / keypress / keyup事件,以模拟用户“经典”交互以发送回复?

谢谢

目标示例:https://steemit.com/usa/@gaottantacinque/happy-4th-of-
july

在开发工具控制台中:

function nap (durationMs) {
  new Promise(resolve => setTimeout(() => resolve(), durationMs))
}

async function replyToPost() {
  var replyBtn = document.getElementsByClassName("PostFull__reply")[0]
    .getElementsByTagName('a')[0];
  replyBtn.click();
  await nap(1000);
  var textarea = document.getElementsByTagName('textarea')[0];
  const msg = 'My programmatically generated comment goes here';
  textarea.focus();
  textarea.click();
  textarea.value = msg; // textarea.innerHTML = msg; textarea.innerText = msg;
  await nap(100);
  var postReplyBtn = document.querySelectorAll('[type=submit]')[1];
  // postReplyBtn.disabled = false;
  postReplyBtn.click();
}

replyToPost();

注意:此代码将填充文本区域,但该按钮仍处于禁用状态。只需手动单击文本区域,然后键入任何内容即可启用按钮。

此外,例如,在背景上单击后,以编程方式插入的textarea值会消失,但在正常输入时不会消失。


问题答案:

经过一切尝试后,我发现问题似乎是React触发textareas的onchange时的一个错误。

有关该错误的更多信息

有一种解决方法。

function setNativeValue(element, value) {
  const valueSetter = Object.getOwnPropertyDescriptor(element, 'value').set;
  const prototype = Object.getPrototypeOf(element);
  const prototypeValueSetter = Object.getOwnPropertyDescriptor(prototype, 'value').set;

  if (valueSetter && valueSetter !== prototypeValueSetter) {
    prototypeValueSetter.call(element, value);
  } else {
    valueSetter.call(element, value);
  }
}

var textarea = document.getElementsByTagName('textarea')[0];
setNativeValue(textarea, 'My automated comment here');
textarea.dispatchEvent(new Event('input', { bubbles: true }));


 类似资料:
  • 如何以编程方式从java代码填充旋转器? 我在布局中有一个旋转器,如下所示:

  • 问题内容: 我的任务是使用React构建的抓取网站。我正在尝试填写输入字段,并使用javascript注入页面(移动设备中的selenium或webview)来提交表单。这在其他所有站点+技术上都像魅力一样起作用,但是React似乎是一个真正的痛苦。 所以这是示例代码 我的值在DOM输入元素上更改,但是React不会触发change事件。 我一直在尝试多种不同的方法来使React更新状态。 徒劳无

  • 我的要求是在不创建任何外部文件的情况下加载数据,我正在寻找类似于以下内容的东西:

  • 使用 lavas init 创建的模板项目中,在以下场景下都会以编程方式使用 Lavas: server.dev.js 开发环境下的 SPA/SSR 模式。 server.prod.js 生产环境下的 SSR 模式。 可见以编程方式使用 Lavas 的主要场景就是 SSR 模式,而在 SPA 模式下仅仅是供开发服务器使用。因此,如果开发者选择了 SSR 模式,阅读下面的内容将十分有帮助: 如何选择

  • 我想以编程方式为RadioGroup添加边距或填充,但它不起作用。 单选按钮: Java代码: 我尝试使用和,但它不起作用

  • 问题内容: 当我需要保存一个对象列表时,每个对象都应保存在它自己的事务中(这样,如果一个对象失败了,它们就不会全部失败),我可以这样做: 我之所以使用,是因为如果一本书无法保存并且交易被回滚,则该会话将无效,这将阻止后续书籍的保存。但是,这种方法存在两个问题: 有点冗长 即使上一本书成功,也会为每本书创建一个新的会话 有没有更好的办法?我发生的一种可能性是依赖注入Hibernate,然后执行此操作