使用 Tampermonkey 通过 javascript 自动填写表单时未发送表单
Form not sent when auto filling form via javascript using Tampermonkey
我正在使用以下代码尝试自动填充我在我工作的公司的每日工作时间。
(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 据我所知,这些字段没有什么特别之处。
table的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 && 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 && 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 && 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 && 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>
保存按钮 HΤΜ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("loadingmsg").style.visibility = "visible";document.getElementById("loadingmsg").display = "block";} catch(e) {;}"
value=" שמור " name="right">
有一件事可能会阻止您的代码工作。
在每个 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();
行应该足以模拟用户与此按钮的交互。
如果这不起作用,您应该在输入和提交按钮上检查潜在的“JavaScript 已注册”事件侦听器(带有 addEventListener
),并将它们添加到问题中。
我正在使用以下代码尝试自动填充我在我工作的公司的每日工作时间。
(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 据我所知,这些字段没有什么特别之处。
table的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 && 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 && 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 && 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 && 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>
保存按钮 HΤΜ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("loadingmsg").style.visibility = "visible";document.getElementById("loadingmsg").display = "block";} catch(e) {;}"
value=" שמור " name="right">
有一件事可能会阻止您的代码工作。
在每个 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();
行应该足以模拟用户与此按钮的交互。
如果这不起作用,您应该在输入和提交按钮上检查潜在的“JavaScript 已注册”事件侦听器(带有 addEventListener
),并将它们添加到问题中。