2010-06-09 67 views
82

我正在写一些JavaScript(一个greasemonkey/userscript),它将在网站上的表单中插入一些输入字段。停止提交表单中的输入字段

事情是,我不希望那些输入字段以任何方式影响表单,我不希望它们在提交表单时提交,我只希望我的javascript能够访问它们的值。

有什么方法可以将一些输入字段添加到表单的中间,并且在表单提交时没有提交它们?

显然,理想的情况是输入字段不在表单元素中,但是我希望我的结果页面的布局使我插入的输入字段出现在原始表单的元素之间。

+2

什么问题如果他们提交?您可以选择以服务器端语言处理哪些字段。 – Sarfraz 2010-06-09 17:01:30

+4

我不相信提交表单时出现了未命名的表单元素 - 如果您可以编写您的JS以通过ID引用它们,则可以将它们的名称留空,从而有效地阻止它们提交。 – 2010-06-09 17:02:17

+1

将name属性字段留空 – deostroll 2010-06-09 17:03:27

回答

122

你可以插入输入字段没有“name”属性:

<input type="text" id="in-between" /> 

或者一旦形式(jQuery中)提交的,你可以简单地删除它们:

$("form").submit(function() { 

    $(this).children('#in-between').remove(); 

}); 
+7

忽略名称会阻止提交它?很酷,我不知道。这是否适用于所有浏览器?它是一个标准的一部分,还是一个实现的怪癖? – BlairHippo 2010-06-09 17:12:20

+0

如果没有名称属性的输入元素没有提交,那么这是一个非常简单的完美解决方案!这是跨浏览器兼容吗?有人可以确认吗? – Acorn 2010-06-09 17:14:51

+2

@Acorn我不完全确定,但值得一读。本质上,如果您省略“name”属性值,则无法通过任何方法访问该值......因此,该值可能仅由浏览器丢弃。如果对你来说很关键,那就去jquery/javascript选项(注意,当javascript被禁用时,这些字段将被提交 - 所以不要依赖你的任何安全机制)。 – Gal 2010-06-09 17:23:29

41

最简单的做法是插入具有disabled属性的元素。

<input type="hidden" name="not_gonna_submit" disabled="disabled" value="invisible" /> 

这样你仍然可以作为窗体的子项访问它们。

已禁用字段的缺点是用户根本无法与其交互 - 所以如果您有disabled文本字段,用户将无法选择文本。如果您有disabled复选框,则用户无法更改其状态。

你也可以在表单提交时写入一些JavaScript来消除你不想提交的字段。

+0

这个想法是为了我插入的字段是可用的,以便用户可以更改复选框等,然后将它们提交给我的JavaScript – Acorn 2010-06-09 17:05:04

+0

那么,然后禁用不会为你工作:) – Johrn 2010-06-09 17:24:01

+2

残疾人可以仍然工作,如果你只禁用提交或基于选中复选框的字段。这样你就不会丢掉'name'属性,如果你希望稍后使用它,你可能想保留这个属性。 – JMTyler 2013-03-15 14:55:33

0

处理表单提交在一个函数中通过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); 
} 

这将让你你在寻找什么。

0

你甚至需要它们作为输入元素吗?您可以使用Javascript动态创建div或段落或列表项目或任何包含您想要呈现的信息的内容。

但是,如果交互式元素很重要,并且将这些元素放置在<form>块之外是个痛处,那么应该可以在提交页面时从表单中删除这些元素。

+0

是的,我确实需要它们作为输入元素,因为我试图获取用户输入。 – Acorn 2010-06-09 17:23:43

7

您可以编写一个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; 
1

我知道这个帖子是古老的,但无论如何,我会回答。我找到的最简单/最好的方法就是简单地将名称设置为空白。前

将这个您的提交:

document.getElementById("TheInputsIdHere").name = ""; 

所有在所有提交功能,可能是这样的:

document.getElementById("TheInputsIdHere").name = ""; 
document.getElementById("TheFormsIdHere").submit(); 

这仍然将提交表单与所有其他领域,而将不要提交没有名字的人。

+0

简单而直接。我喜欢! – pbarney 2017-08-23 16:50:44

6

简单尝试从输入元素中删除名称属性。
所以它看起来像

<input type="checkbox" checked="" id="class_box_2" value="2"> 
+0

这应该是答案:)) – 2016-11-06 17:16:19

+0

这适用于复选框。 但请注意,这将打破与单选按钮一起使用时另一个单选按钮的自动取消选择。 – anre 2017-02-24 19:28:11

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>
+0

不幸的是,表单属性在IE/Edge中不起作用。 http://caniuse.com/#search=form%20attribute – 2016-07-01 16:15:01

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; 
     } 
    } 

这对我的作品每次:)

2

输入添加禁用=“禁用”和jQuery的同时去除

当你想使用.removeAttr提交它禁用(“禁用”)属性

HTML:

<input type="hidden" name="test" value="test" disabled='disabled'/>

的jQuery:

$("input[name='test']").removeAttr('disabled');

4

我只是想增加一个额外的选项:在你输入添加表单标签,并指定不网页上的存在形式的名称:

<input form="fakeForm" type="text" readonly value="random value" /> 
+0

虽然这可能有效(未测试),除非您实际上在其他地方定义了“fakeForm”(无需提交),这会导致无效的HTML。 – 2017-05-11 10:22:25

+0

如果您不想添加javascript,并且您需要与用户交互的表单内的输入。从我的角度来看,这是迄今为止最简单的解决方案。 – yannisalexiou 2017-10-29 20:11:01