我正在编写一些javascript(lubricmonkey /用户脚本),它将一些输入字段插入网站上的表单中。
问题是,我不希望这些输入字段以任何方式影响表单,我不希望它们在提交表单时提交,我只希望我的JavaScript可以访问它们的值。
有什么办法可以在表单中间添加一些输入字段,而在提交表单时不提交它们呢?
显然,理想的情况是输入字段不在form元素中,但是我希望结果页面的布局使插入的输入字段出现在原始表单的元素之间。
我正在编写一些javascript(lubricmonkey /用户脚本),它将一些输入字段插入网站上的表单中。
问题是,我不希望这些输入字段以任何方式影响表单,我不希望它们在提交表单时提交,我只希望我的JavaScript可以访问它们的值。
有什么办法可以在表单中间添加一些输入字段,而在提交表单时不提交它们呢?
显然,理想的情况是输入字段不在form元素中,但是我希望结果页面的布局使插入的输入字段出现在原始表单的元素之间。
Answers:
您可以插入没有“名称”属性的输入字段:
<input type="text" id="in-between" />
或者,您也可以在提交表单后直接删除它们jQuery
:
$("form").submit(function() {
$(this).children('#in-between').remove();
});
最简单的方法是将带有disabled
属性的元素插入。
<input type="hidden" name="not_gonna_submit" disabled="disabled" value="invisible" />
这样,您仍然可以作为表单的子级来访问它们。
禁用字段具有用户根本无法与之交互的缺点-因此,如果您有disabled
文本字段,则用户将无法选择文本。如果您有一个disabled
复选框,则用户无法更改其状态。
您还可以编写一些JavaScript,以在表单提交时触发,以删除您不想提交的字段。
name
属性,而且还可以保留该属性,以备以后使用。
name
属性时,这非常有用。
简单尝试从输入元素中删除名称属性。
所以它必须看起来像
<input type="checkbox" checked="" id="class_box_2" value="2">
我只是想添加一个附加选项:在您的输入中添加form标记并指定页面上不存在的表单的名称:
<input form="fakeForm" type="text" readonly value="random value" />
fakeForm
其他地方实际定义(无需提交),否则将导致HTML无效。
您可以为其编写事件处理程序onsubmit
,以name
从所有不想包含在表单提交中的输入字段中删除该属性。
这是一个未经测试的快速示例:
var noSubmitElements = [ 'someFormElementID1', 'someFormElementID2' ]; //...
function submitForm() {
for( var i = 0, j = noSubmitElements.length; i < j; i++ ) {
document.getElementById(noSubmitElements[i]).removeAttribute('name');
}
}
form.onsubmit = submitForm;
我知道这篇文章很古老,但是我还是会回复。我发现的最简单/最好的方法就是简单地将名称设置为空白。
将其放在您提交之前:
document.getElementById("TheInputsIdHere").name = "";
总而言之,您的Submit函数可能如下所示:
document.getElementById("TheInputsIdHere").name = "";
document.getElementById("TheFormsIdHere").submit();
这仍然会提交表单以及您所有其他字段,但是不会提交没有名称的表单。
以上所有答案已经说明了有关(不)命名表单控件或在实际提交表单之前以编程方式删除它们的所有内容。
尽管在我的研究中,我发现了本文中未提及的另一种解决方案:
如果封装表单控件,而您想不对其进行处理/不发送,则将其封装在另一个<form>
没有method
属性或path
(也显然没有提交类型控件)的标记中(例如按钮或嵌套在其中的提交输入),则提交父表单将不包含那些封装的表单控件。
<form method="POST" path="/path">
<input type="text" name="sent" value="..." />
<form>
<input type="text" name="notSent" value="..." />
</form>
<input type="submit" name="submit" value="Submit" />
</form>
[name =“ notSent”]控制值不会被处理也不会发送到服务器POST端点,但是[name =“ sent”]中的值将被处理。
这个解决方案可能很有趣,但我仍然留给后代...
通过onSubmit()在函数中处理表单的提交,并执行以下类似操作以删除表单元素:使用getElementById()
DOM,然后使用[object].parentNode.removeChild([object])
假设您所讨论的字段具有id属性“ my_removable_field”代码:
var remEl = document.getElementById("my_removable_field");
if ( remEl.parentNode && remEl.parentNode.removeChild ) {
remEl.parentNode.removeChild(remEl);
}
这将为您提供所需的确切信息。
$('#serialize').click(function () {
$('#out').text(
$('form').serialize()
);
});
$('#exclude').change(function () {
if ($(this).is(':checked')) {
$('[name=age]').attr('form', 'fake-form-id');
} else {
$('[name=age]').removeAttr('form');
}
$('#serialize').click();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="/">
<input type="text" value="John" name="name">
<input type="number" value="100" name="age">
</form>
<input type="button" value="serialize" id="serialize">
<label for="exclude">
<input type="checkbox" value="exclude age" id="exclude">
exlude age
</label>
<pre id="out"></pre>
您需要在表单上添加onsubmit:
<form action="YOUR_URL" method="post" accept-charset="utf-8" onsubmit="return validateRegisterForm();">
脚本将如下所示:
function validateRegisterForm(){
if(SOMETHING IS WRONG)
{
alert("validation failed");
event.preventDefault();
return false;
}else{
alert("validations passed");
return true;
}
}
每次都对我有用:)