【问题标题】:Input form is judged to be empty even after value is set by JavaScriptJavaScript 设置值后,输入表单判断为空
【发布时间】:2020-03-31 19:32:12
【问题描述】:

我正在尝试编写一个在this login page 中自动输入用户名的小脚本。根据 Inspector (of Firefox),输入字段被标识为 CSS 选择器input.input.input-text.input-default。所以我写了下面的脚本。

(function() {
    "use strict";

    window.setTimeout(() => {
        const username = document.querySelector('input.input.input-text.input-default');
        username.setAttribute('value', 'test');
    }, 100); //waits a little until the input form becomes available

})();

这个输入用户名test其实是成功的,但是当我输入密码点击提交按钮时,报错信息

用户名是必填项

即使字段不为空也会打印。

之后,如果我单击用户名字段,附加任何字符,删除该字符,然后再次单击提交按钮(见下面的 gif),现在该字段的值被正确解释并出现错误消息

身份验证失败

打印出来了,这完全没问题,因为我们使用了无效的test 作为用户名。

我认为这种行为来自与输入字段相关的事件。据 Inspector 称,focusinvalidkeydownmousedownonChange 事件绑定到该字段。但是,即使我执行

username.dispatchEvent(new Event('onChange'));

或者这样,该值仍然被解释为空。

两个问题:

  • 如何使脚本在这种情况下工作?

  • 如果你成功地使脚本工作,你能告诉我你是如何分析网站的代码结构的吗?现在我用 Inspector 但似乎不够用。

【问题讨论】:

  • 请同时提供表单的HTML代码。
  • @ikiK 你可以访问我在 OP 第一行链接的网站。很抱歉我不能在这里粘贴整个代码,因为它很复杂而且不是开源的。

标签: javascript html forms dom


【解决方案1】:

问题 1

只要在第一个sn-p下面加上一行,问题就解决了。

username.dispatchEvent(new Event('input', {bubbles: true}));

所以生成的代码应该是

(function() {
    "use strict";

    window.setTimeout(() => {
        const username = document.querySelector('input.input.input-text.input-default');
        username.setAttribute('value', 'test');
        username.dispatchEvent(new Event('input', {bubbles: true})); //only difference
    }, 100);

})();

我确实知道,为什么 {bubbles: true} 能做到这一点。

问题 2

我是这样想出这条线的:

  1. 当我执行console.log(username) 时,我发现该对象具有__reactEventHandlers 属性,该属性具有onChange 方法。自
username.dispatchEvent(new Event('onChange'));
username.dispatchEvent(new Event('change'));
username.dispatchEvent(new Event('input'));

等根本不起作用,我怀疑 __reactEventHandlers 在这种情况下是相关的。

  1. 为了从 JavaScript 调用 onChange 方法,我在 Google 上搜索了“javascript call react onchange”并找到了 this answer

再说一次,我确实知道为什么{bubbles: true} 会起作用,应该将其附加到此答案或在另一个答案中进行解释。

【讨论】:

  • 这是一个 React 应用程序吗?您绝对不想使用 DOM 操作来更改值。没有(理智的)人会花时间弄清楚你的 React 组件如何使用开发工具,如果你不能发布源代码然后写一个最小的例子来重现你的问题(提示......你必须设置使用 React 提供的值,而不是设置 value 属性)。
  • 如果您使用useState()setState() 作为类组件,它可能是setXyz() 函数,或者开始使用useReducer() 来公开可以从不相关组件调用的操作如果您需要在包含值本身的组件之外设置值。
  • @AdrianoRepetti 这是一个 React 应用程序吗? 我不知道。该网站不是由我维护的。我只是该站点的用户,并试图编写一个仅由我通过greasemonkey 使用的用户脚本。无论如何,谢谢你的建议。我会尝试理解 React(目前我什至不是 React 的初学者)。
  • 如果您需要自动化一个您不拥有的网站,您可能想尝试发送关键事件(keyDown 和朋友)而不是处理 HTML。
  • 第一个随机结果(可能还有很多更好的结果):stackoverflow.com/questions/13598909/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多