停止提交表单中的输入字段

Aco*_*orn 104 html javascript forms userscripts

我正在写一些javascript(一个greasemonkey/userscript),它会将一些输入字段插入到网站上的表单中.

问题是,我不希望这些输入字段以任何方式影响表单,我不希望在提交表单时提交它们,我只希望我的javascript可以访问它们的值.

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

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

Gal*_*Gal 150

您可以插入没有"name"属性的输入字段:

<input type="text" id="in-between" />
Run Code Online (Sandbox Code Playgroud)

或者你可以在提交表单后简单地删除它们(在jquery中):

$("form").submit(function() {
   $(this).children('#in-between').remove();
});
Run Code Online (Sandbox Code Playgroud)

  • 我测试了使用chrome,firefox,safari省略了name属性,似乎表单字段正在提交给服务器,名称为空字符串.我使用WebScarab检查了帖子数据,发现数据正在发送.现在我想我必须禁用这些字段以防止它们被提交. (17认同)
  • 省略名称会阻止它被提交?很酷,我不知道.这适用于所有浏览器吗?它是标准的一部分,还是实施怪癖? (7认同)
  • +1它的功能就像一个魅力,在IE7,IE8,Chrome24,FF11上测试过 (4认同)
  • [如果输入标签没有名称,表单数据是否仍会传输?](http://stackoverflow.com/questions/12543848/does-form-data-still-transfer-if-the-input-tag-has-no-名称) (4认同)
  • @Acorn我不完全确定,但值得一读.基本上,如果省略"name"属性值,则无法通过任何方法访问该值...因此,浏览器可能会丢弃该值.如果它对您来说是安全的关键,请转到jquery/javascript选项(只需注意,当javascript被轻松禁用时,将提交字段 - 因此不要依赖任何安全机制). (2认同)

Joh*_*hrn 52

最简单的方法是插入带有disabled属性的元素.

<input type="hidden" name="not_gonna_submit" disabled="disabled" value="invisible" />
Run Code Online (Sandbox Code Playgroud)

这样您仍然可以作为表单的子项访问它们.

禁用字段的缺点是用户根本无法与它们交互 - 因此,如果您有disabled文本字段,则用户无法选择文本.如果您有一个disabled复选框,则用户无法更改其状态.

您还可以在表单提交时编写一些javascript以删除您不想提交的字段.

  • 如果您仅禁用onsubmit上的字段或基于选中的复选框,则Disabled仍然可以工作.这样你就不会丢掉`name`属性,如果你想在以后使用它,你可能想要保留它. (3认同)

Les*_*iev 12

简单的尝试从input元素中删除name属性.
所以它必须看起来像

<input type="checkbox" checked="" id="class_box_2" value="2">
Run Code Online (Sandbox Code Playgroud)

  • 这适用于复选框。但是请注意,当与单选按钮一起使用时,这将破坏其他单选按钮的自动取消选择。 (3认同)

小智 9

我只是想添加一个附加选项:在您的输入中添加表单标记并指定页面上不存在的表单的名称:

<input form="fakeForm" type="text" readonly value="random value" />
Run Code Online (Sandbox Code Playgroud)

  • 虽然这可能有效(尚未测试),除非您实际上在其他地方定义了“fakeForm”(无需提交),否则这会导致无效的 HTML。 (3认同)
  • 如果您不想添加 javascript 并且需要在表单内进行用户交互输入。从我的角度来看,这是迄今为止最简单的解决方案。 (2认同)
  • 注意:此解决方案**不适用于 IE**。检查[此处](https://caniuse.com/#feat=form-attribute) (2认同)
  • 看起来 `form=""` 足以排除提交的字段。在 Firefox 102 和 Brave 和 Chromium 103 中进行了测试,我不是苹果囚犯(这里没有 Safari)。谁还关心像 IE 这样被弃用的恐龙呢...... (2认同)

Jac*_*kin 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;
Run Code Online (Sandbox Code Playgroud)


小智 6

上述所有答案已经说明了有关(不)命名表单控件或在实际提交表单之前以编程方式删除它们的所有内容。

尽管如此,在我的研究中,我发现了我在这篇文章中没有提到的另一个解决方案:
如果您将想要未处理/不发送的表单控件封装在另一个<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>
Run Code Online (Sandbox Code Playgroud)

[name="notSent"] 控制值不会被处理,也不会发送到服务器 POST 端点,但来自 [name="sent"] 的控制值会被处理。

这个解决方案可能是轶事,但我仍然把它留给后代......

  • 有趣的观察,但是你在不同的浏览器中测试过这个吗?我想知道这是设计使然、规范规定还是浏览器行为的一个怪癖。随着浏览器的变化,它会成为未来可靠的方法吗? (2认同)

Wil*_*ill 5

我知道这个帖子很古老,但我还是会回复。我发现的最简单/最好的方法就是简单地将名称设置为空白。

把这个放在你提交之前:

document.getElementById("TheInputsIdHere").name = "";
Run Code Online (Sandbox Code Playgroud)

总而言之,您的提交功能可能如下所示:

document.getElementById("TheInputsIdHere").name = "";
document.getElementById("TheFormsIdHere").submit();
Run Code Online (Sandbox Code Playgroud)

这仍将提交包含所有其他字段的表单,但不会提交没有名称的表单。

  • 如果没有“name”属性,某些类型的输入(例如“radio”)将无法正常工作。 (2认同)