我正在编写一些javascript(一个greasemonkey / userscript),它会将一些输入字段插入到网站上的表单中。
问题是,我不希望这些输入字段以任何方式影响表单,我不希望在提交表单时提交它们,我只希望我的javascript可以访问它们的值。
是否有某种方法可以在表单中间添加一些输入字段,并在提交表单时不提交它们?
显然理想的情况是输入字段不在表单元素中,但我希望结果页面的布局使我插入的输入字段显示在原始表单的元素之间。
答案 0 :(得分:145)
您可以插入没有“name”属性的输入字段:
<input type="text" id="in-between" />
或者你可以在提交表单后简单地删除它们(在jquery中):
$("form").submit(function() {
$(this).children('#in-between').remove();
});
答案 1 :(得分:48)
最简单的方法是插入带有disabled
属性的元素。
<input type="hidden" name="not_gonna_submit" disabled="disabled" value="invisible" />
这样您仍然可以作为表单的子级访问它们。
禁用字段的缺点是用户根本无法与它们进行交互 - 因此,如果您有disabled
文本字段,则用户无法选择文本。如果您有disabled
复选框,则用户无法更改其状态。
您还可以在表单提交时编写一些javascript来删除您不想提交的字段。
答案 2 :(得分:10)
只需尝试从输入元素中删除 name 属性 所以它必须看起来像
<input type="checkbox" checked="" id="class_box_2" value="2">
答案 3 :(得分:8)
您可以为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;
答案 4 :(得分:8)
我只想添加一个附加选项:在您的输入中添加表单标记并指定页面上不存在的表单名称:
<input form="fakeForm" type="text" readonly value="random value" />
答案 5 :(得分:3)
在输入中添加禁用=“禁用”,而当您想使用.removeAttr('disabled')
提交时,jquery会删除该属性<强> HTML:强>
<input type="hidden" name="test" value="test" disabled='disabled'/>
<强> jquery的:强>
$("input[name='test']").removeAttr('disabled');
答案 6 :(得分:2)
以上所有答案已经说明了有关(而不是)命名表单控件或在实际提交表单之前以编程方式删除它们的所有内容。
尽管如此,在整个研究过程中,我发现了本文中未提及的其他解决方案:
如果您封装了要处理/不发送的表单控件,请在另一个<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”]中的值将被处理。
此解决方案可能很有趣,但我仍然留给后代...
答案 7 :(得分:1)
我知道这篇文章很古老,但无论如何我都会回复。我找到的最简单/最好的方法就是将名称简单地设置为空白。
在提交前加上:
document.getElementById("TheInputsIdHere").name = "";
总而言之,您的提交功能可能如下所示:
document.getElementById("TheInputsIdHere").name = "";
document.getElementById("TheFormsIdHere").submit();
这仍然会提交包含所有其他字段的表单,但不会提交没有名称的表单。
答案 8 :(得分:0)
通过onSubmit()处理表单在函数中的提交,并执行类似下面的操作以删除表单元素:
使用DOM的getElementById()
,然后使用[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);
}
这将为您提供您正在寻找的东西。
答案 9 :(得分:0)
您是否首先需要它们作为输入元素?您可以使用Javascript动态创建div或段落或列表项或包含您要呈现的信息的任何内容。
但是,如果交互元素很重要并且将这些元素置于<form>
块之外,那么就应该可以在提交页面时从表单中删除这些元素。
答案 10 :(得分:0)
$('#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>
答案 11 :(得分:0)
您需要在表单中添加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;
}
}
每次都适合我:)