フォームの入力フィールドが送信されないようにする


114

ウェブサイトのフォームにいくつかの入力フィールドを挿入するjavascript(greasemonkey / userscript)を書いています。

問題は、これらの入力フィールドがフォームに影響を与えたくない、フォームが送信されたときに送信されたくない、JavaScriptがそれらの値にアクセスできるようにすることだけです。

フォームの途中にいくつかの入力フィールドを追加し、フォームが送信されたときにそれらを送信させない方法はありますか?

入力フィールドがフォーム要素にないことが理想的であることは明らかですが、結果のページのレイアウトで、挿入された入力フィールドが元のフォームの要素の間に表示されるようにしたいと思います。


2
彼らが提出された場合の問題は何ですか?サーバー側の言語で処理するフィールドを選択できます。
Sarfraz

6
名前のないフォーム要素がフォームの送信時に表示されるとは思わない-IDで参照するようにJSを記述できれば、名前を空のままにして、送信を事実上防ぐことができます。
gddc

2
名前属性フィールドを空白のままにします
deostroll

@Sarfraz Ahmed:私はgreasemonkeyスクリプトを書いているので、ウェブサイトを制御できません。
ドングリ

11
w3によると、フォームの送信に含まれます。フィールド(フォーム要素)はフォーム要素内で定義する必要があり、名前属性が必要です。名前のない要素やフォームに含まれていない要素はサーバーに送信されません。
kennebec

回答:


159

「name」属性なしで入力フィールドを挿入できます:

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

または、フォームが(でjQuery)送信されたら、単に削除することもできます。

$("form").submit(function() {
   $(this).children('#in-between').remove();
});

7
名前を省略すると、送信できなくなりますか?かっこいい、知らなかった。これはすべてのブラウザで機能しますか?それは標準の一部ですか、それとも実装の癖ですか?
BlairHippo

2
@Acorn私は完全にはわかりませんが、それについて読む価値があります。基本的に「name」属性値を省略すると、どのメソッドからもその値にアクセスできなくなります。そのため、値がブラウザによって単に破棄される可能性があります。安全であることが極めて重要な場合は、jquery / javascriptオプションを選択してください(JavaScriptが簡単に無効にされている場合、フィールドが送信されることに注意してください。セキュリティメカニズムに依存しないでください)。
Galの

17
name属性をchrome、firefox、safariで除外することをテストしましたが、フォームフィールドが名前の空の文字列でサーバーに送信されているようです。WebScarabを使用して投稿データを検査したところ、データが送信されていることがわかりました。今のところ、フィールドが送信されないようにするには、フィールドを無効にする必要があると思います。
kldavis4

1
@ kldavis4-ストライプ(stripe.js)とブレインツリー(braintree.js)の両方[リンク] braintreepayments.com/docs/python/guide/getting_paid は、「名前を残す」属性の概念を使用して、サーバーにヒットするデータを停止しているようですしたがって、「PCI」への準拠の必要性が減少します...「データ」が送信されていると言った場合、エラーですか?
Rahul Dighe 2013年


57

最も簡単なことは、disabled属性を持つ要素を挿入することです。

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

この方法でも、フォームの子としてそれらにアクセスできます。

無効化されたフィールドには、ユーザーがフィールドを操作できないという欠点があります。したがって、disabledテキストフィールドがある場合、ユーザーはテキストを選択できません。disabledチェックボックスがある場合、ユーザーはその状態を変更できません。

送信したくないフィールドを削除するためにフォームの送信時に起動するjavascriptを書くこともできます。


アイデアは、ユーザーがチェックボックスなどを変更し、それらを私のJavaScriptに送信できるように、挿入したフィールドを使用できるようにすることです。
ドングリ

3
送信時または選択されているチェックボックスに基づいてフィールドを無効にするだけの場合、無効は引き続き機能します。そうnameすれば、後で使用したい場合に備えて、プロパティを捨てるだけではありません。
JMTyler 2013年

これは、AJAXを使用してフォームを送信する必要があり、フォームから入力を削除したくない、またはそのname属性を削除したくない場合に最適です。
Nolonar 2014

15

入力要素から名前属性を削除しようとするだけです。
だからそれはのように見える必要があります

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

これが答えになるはずです:))
MáximaAlekz

1
これはチェックボックスで機能します。ただし、ラジオボタンを使用すると、他のラジオボタンが自動的に選択解除されることに注意してください。
anre

10

追加のオプションを追加したかっただけです。入力にformタグを追加し、ページに存在しないフォームの名前を指定します。

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

1
これはおそらく機能しますが(テストされていません)、実際にfakeForm他の場所で定義しない限り(送信する必要はありません)、これは無効なHTMLになります。
ブライアンH.17年

1
JavaScriptを追加したくない場合、ユーザー操作を伴うフォーム内の入力が必要です。これは、私の観点から見ると、最も単純な解決策です。
yannisalexiou 2017年

1
注:このソリューションはIEでは機能しませんここを
Harvey

@ハーベイ・イケス!ヘッドアップをありがとう!
Joshua Pinter

9

あなたは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;

2

この投稿が古いことは知っていますが、とにかく返信します。私が見つけた最も簡単で最良の方法は、単に名前を空白に設定することです。

あなたの提出前にこれを入れてください:

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

全体として、送信関数は次のようになります。

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

これにより、他のすべてのフィールドを含むフォームが送信されますが、名前のないフォームは送信されません。


シンプルでわかりやすい。私はそれが好きです!
pbarney 2017

2

入力にdisabled = "disabled"を追加し、jqueryが.removeAttr( 'disabled')を使用して送信する場合はdisabled属性を削除します

HTML:

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

jquery:

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


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"]のコントロール値は処理されます。

この解決策は逸話かもしれませんが、私はまだ後世のためにそれを残しています...


興味深い観察ですが、これをさまざまなブラウザーでテストしましたか?それは仕様によるものなのか、仕様によるものなのか、それともブラウザの振る舞いの癖なのかと思います。ブラウザーが変化するので、将来的に信頼できる方法になるでしょうか?
scipilot

1

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
$('#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>

残念ながらform属性はIE / Edgeでは機能しません。caniuse.com/#search=form%20attribute
George Helyar

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

これはいつも私のために働きます:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.