由第三方JS注入提交的棘手的程序化AngularJS表单

时间:2017-07-21 19:08:06

标签: javascript angularjs angularjs-injector

这是一个棘手的问题。我正在编写一个Tampermonkey(用于chrome的vanilla JS注入器插件)脚本,以自动化我每天用于工作数百次的第三方网站。我坚持的部分是我相信一个AngularJS表格(下面的代码)。我需要更改输入的值并提交它,以便它可以更新网站上的表格。请注意,它不会重新发布该网站,它适用于ajax / jquery / AngularJS(不知道)。

我注意到棘手的部分在于输入," ng-pristine ng-valid"似乎是一些AngularJS数据验证,这是提交表单所必需的,虽然我不知道如何在更改输入值或如何提交表单后触发它。改变价值似乎有效。整个表单都在iframe中,但不确定这是否有所不同。

我已经添加了以下元素的ID,因此更容易引用这些元素,但它们通常不存在于代码中,我通过querySelectors获取它们

<form id="form" ng-submit="updateTab()" class="ng-pristine ng-valid">
    <div class="input">
      <div class="input__container">
        <input id="input" type="text" class="input ng-pristine ng-valid" ng-model="QueryParams.query">
        <button id="button" class="button">Search</button>
      </div>
    </div>
</form>

在完成设置值并单击按钮之前,我已做过很多次这样的事情:

document.getElementById("input").value = "some value";
document.getElementById("button").Click();

但它不起作用。在值更改之后和之前的.click()之前我也尝试过以下操作,因为似乎有一些数据验证,但它仍然没有帮助。

document.getElementById("input").dispatchEvent(new Event("change"));
document.getElementById("input").onchange();

提交表单只是重新加载网站,但没有取得任何成果。

1 个答案:

答案 0 :(得分:1)

有很多方法可以解决这个问题,哪种方法是正确的,通常是特定于方案的。这个问题:Angular.js programmatically setting a form field to dirty列出了其中的一些问题。