首页 > 解决方案 > 使用 Tampermonkey 通过 javascript 自动填写表单时未发送表单

问题描述

我正在使用以下代码尝试自动填充我在我工作的公司的每日工作时间。

(function() {
  'use strict';
  //debugger;
  var date = document.querySelector("#filter_day").value
  var alreadyRun = GM_getValue(date, false);
  if (!alreadyRun) {
    GM_setValue(date, true);
    document.querySelector("#fstjid_1").selectedIndex = 5;
    document.querySelector("#time_start_MM_1").setAttribute('value', "00");
    document.querySelector("#time_start_HH_1").setAttribute('value', "10");
    document.querySelector("#time_end_MM_1").setAttribute('value', "00");
    document.querySelector("#time_end_HH_1").setAttribute('value', "19");
    document.getElementById("save_btn").click();
  }
})();

但是由于某种原因,当使用脚本设置每小时字段并单击保存按钮(脚本是否手动执行)时,不会发送表单,只是刷新页面并清除值。

似乎手动设置每小时字段和脚本设置它之间存在一些不同,但我不能说为什么。

我尝试使用setAttribute以及简单地使用.value=. 我尝试使用双括号"和单个'. 似乎没有任何工作和分析 HTML 据我所知,这些字段没有什么特别之处。

表格的 HTML:

<table border="0" dir="rtl" width="100%" cellspacing="0" cellpadding="0" style="table-layout:fixed;color:#4e546d ">
  <tbody>
    <tr iminnertable="true">
      <td rowspan="99" style="BORDER-RIGHT: #80a3a8 1pt solid;text-align:center" major="1" dir="ltr" align="center" nowrap=""><input class="input_text_fix" type="text" name="time_start_HH_1" id="time_start_HH_1" value="10" maxlength="2" fieldname="time_start_HH" caption="" style="width:22.0;background-color:#f8f8fb; " onkeypress="return !(window.event &amp;&amp; window.event.keyCode == 13);"
          onkeyup="if(event.keyCode!=9) if(this.value.length>=2) this.nextSibling.nextSibling.focus()" onchange="flag_touched(this);" tabindex="10">:<input type="text" class="input_text_fix" name="time_start_MM_1" id="time_start_MM_1" value="00" maxlength="2"
          fieldname="time_start_MM" caption="" onkeypress="return !(window.event &amp;&amp; window.event.keyCode == 13);" style="width:22.0;background-color:#f8f8fb; " onchange="flag_touched(this);" tabindex="10.5">
      </td>
      <td rowspan="99" style="BORDER-RIGHT: #80a3a8 1pt solid;text-align:center" major="1" dir="ltr" align="center" nowrap=""><input class="input_text_fix" type="text" name="time_end_HH_1" id="time_end_HH_1" value="19" maxlength="2" fieldname="time_end_HH" caption="" style="width:22.0;background-color:#f8f8fb; " onkeypress="return !(window.event &amp;&amp; window.event.keyCode == 13);"
          onkeyup="if(event.keyCode!=9) if(this.value.length>=2) this.nextSibling.nextSibling.focus()" onchange="flag_touched(this);" tabindex="10">:<input type="text" class="input_text_fix" name="time_end_MM_1" id="time_end_MM_1" value="00" maxlength="2"
          fieldname="time_end_MM" caption="" onkeypress="return !(window.event &amp;&amp; window.event.keyCode == 13);" style="width:22.0;background-color:#f8f8fb; " onchange="flag_touched(this);" tabindex="10.5">
      </td>
      <td align="center" rowspan="99" style="BORDER-RIGHT: #80a3a8 1pt solid;text-align:center" major="1" val="9.00">
        <input type="text" dir="rtl" name="work_hours_1" value="9.00" class="tableDyn" fieldname="work_hours" style="direction:rtl;width:44;background-color:#f8f8fb;font-size:11px;;  border:none;" readonly="" tabindex="10"></td>
      <td style="display:none;width:0" rowspan="99" major="1"><input type="hidden" name="units_1" id="units_1" value="" fieldname="units"></td>
    </tr>
  </tbody>
</table>

保存按钮 ΗΤΜL:

<input class="button_free_width" id="save_btn" type="button" onclick="try{dontPopWarn=1;submit();this.disabled=true;if (save_btn_1) save_btn_1.disabled=true;}catch(e){;}try {document.getElementById(&quot;loadingmsg&quot;).style.visibility = &quot;visible&quot;;document.getElementById(&quot;loadingmsg&quot;).display = &quot;block&quot;;} catch(e) {;}"
  value="  שמור  " name="right">

标签: javascripttampermonkey

解决方案


一件事可能会阻止您的代码工作。

每一个input都有onchange="flag_touched(this);"可能导致网页以某种内部 JavaScript 状态存储当前值。这意味着您必须change在输入上手动调度事件才能模仿用户输入。

尝试使用这样的函数来有效地改变输入的值:

function changeInputValue(element, value) {
  if (element instanceof HTMLInputElement) {
    element.value = value;
  }
  else if (element instanceof HTMLSelectElement) {
    element.selectedIndex = value;
  }

  element.dispatchEvent(new Event('change', { bubbles: true }));
}

提交按钮在click事件中有一些 JavaScript,但它不是,type="submit"所以它的行为不像原生提交按钮,那么该document.getElementById("save_btn").click();行应该足以模拟用户与此按钮的交互。

如果这不起作用,您应该addEventListener在输入和提交按钮上检查潜在的“JavaScript 注册”事件侦听器(带有 ),并将它们添加到问题中。


推荐阅读