如何修复:小书签中的 'This field is required' 错误

How to fix: 'This field is required' error in bookmarklet

为 mongodb 大学网站 (https://university.mongodb.com/login) 创建自动登录小书签时出现问题,即使输入了数据,字段似乎还是空的,如果我 delete/add 一些字母然后 return 到原始数据。

检查 Html:

有了这些信息,我可以创建我的个人自动登录小书签:

javascript:(function(){
    document.getElementById('email').value='myEmail';
    document.getElementById('password').value='myPassword';
    document.getElementsByTagName('button')[0].click();
})();

字段已填写,按钮已激活,但字段显示为空,我在控制台中收到错误消息:HTTP400:无效请求 - 服务器无法处理请求,因为语法无效。 (获取)POST - https://university.mongodb.com/login

如果我 delete/add 一些字母然后 return 到原始数据,错误就会消失。 例子: 电子邮件:'myPersonalEmail' 密码:'myPersonalPassword' //改变两个领域... 电子邮件:'myPersonal' 密码:'myPersonal' //返回初始值(正确的)... 电子邮件:'myPersonalEmail' 密码:'myPersonalPassword' //点击按钮一切正常

我该如何解决?

问题似乎是当您更改输入值时应用程序的内部状态没有更新。因此,当您单击提交按钮时,数据(电子邮件和密码)不会发送到服务器。您可以在开发人员工具的 网络选项卡 上查看。

为了使脚本工作,您必须在更改输入值后手动触发输入事件。问题是,该页面是使用 React 库构建的,所有事件都是真正的合成事件。

因此,在这种情况下触发事件比通常情况下要复杂一些。函数 setValue 更改输入值并触发事件。最终代码如下所示:

(function(){
    function setValue(input, value) {
        var nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value").set;

        nativeInputValueSetter.call(input, value);

        var ev2 = new Event('input', { bubbles: true});
        input.dispatchEvent(ev2);
    }

    setValue(document.getElementById('email'), 'myEmail');
    setValue(document.getElementById('password'), 'myPassword');
    document.getElementsByTagName('button')[0].click();
})();