フォームが送信されないようにするにはどうすればよいですか?


242

どこかに送信ボタンがあるフォームがあります。

ただし、送信イベントを何らかの形で「キャッチ」して、発生しないようにしたいと考えています。

これを行う方法はありますか?

送信ボタンはカスタムコントロールの一部であるため、変更できません。


送信ボタンには引き続きアクセスできます。ページをレンダリングし、ページソースを表示してそのClientIDを取得します。次に、jQueryのようなものを使用して、$( '#ctl01_cph01_controlBtn1')。click(function(){return false;});のようなことを行うことができます。
レベリアール

@Rafael:真実...しかし、それは最後の手段です-これは非常に複雑なコントロールです。
Nathan Osman、2010

@Rafはasp.netベースであり、ベストプラクティスではありません。しかし、それは本質的に正しいです。誰かがページを編集すると変更される可能性があるので、ソースを覗いてコントロール名を使用することは避けます。意図しない副作用など。

回答:


259

他の回答とは異なり、返品falseは回答の一部にすぎません。returnステートメントの前にJSエラーが発生するシナリオを考えてみましょう...

html

<form onsubmit="return mySubmitFunction(event)">
  ...
</form>

脚本

function mySubmitFunction()
{
  someBug()
  return false;
}

falseここに戻ることは実行されず、フォームはいずれかの方法で送信されます。またpreventDefault、Ajaxフォーム送信のデフォルトのフォームアクションを防ぐために呼び出す必要があります。

function mySubmitFunction(e) {
  e.preventDefault();
  someBug();
  return false;
}

この場合、バグがあってもフォームは送信されません!

または、try...catchブロックを使用することもできます。

function mySubmit(e) { 
  e.preventDefault(); 
  try {
   someBug();
  } catch (e) {
   throw new Error(e.message);
  }
  return false;
}

4
falseから直接戻りませんonsumbitか?
ProfK 2013年

1
onsubmitでユーザーにエラーメッセージを表示することができます。たとえば、「この必須フィールドに入力してから送信してください」。その場合、event.preventDefaultが非常に便利になります
Mark Chorley

1
@ProfK event.preventDefault()を使用する場合は関係ありません。try/ catchはエラー処理の一部にすぎません
Ben Rowe

11
<form onsubmit = "return mySubmitFunction(event)">が機能しました... Firefoxでイベントという単語を括弧で囲まなければなりませんでした
danday74

5
@BenRowe呼び出されたメソッドにevtパラメータを追加する必要があります。 (<form onsubmit="return mySubmitFunction(evt)">)それ以外の場合は、未定義のエラーが発生します。
UfukSURMEN 2017年

143

onsubmitこのようなインラインイベントを使用できます

<form onsubmit="alert('stop submit'); return false;" >

または

<script>
   function toSubmit(){
      alert('I will not submit');
      return false;
   }
</script>

<form onsubmit="return toSubmit();" >

デモ

さて、これは大きなプロジェクトを作るときに良い考えではないかもしれません。イベントリスナーを使用する必要がある場合があります。

してくださいについての続きを読むイベント・リスナー(addEventListenerをとIEのattachEvent)VSインラインイベントここに。私はそれをクリス・ベイカーが説明した以上に説明できないからです。

どちらも正しいですが、どちらもそれ自体が「最良」ではなく、開発者が両方のアプローチを選択した理由がある可能性があります。


外出先でのすばやい解決策。
Fernando Torres

どういうわけか<form onsubmit="return false;" >、私のために動作しません。
ルアン

102

を使用してフォームにイベントリスナーをアタッチし.addEventListener()、次に.preventDefault()onメソッドを呼び出しますevent

const element = document.querySelector('form');
element.addEventListener('submit', event => {
  event.preventDefault();
  // actual logic, e.g. validate the form
  console.log('Form submission cancelled.');
});
<form>
  <button type="submit">Submit</button>
</form>

これは、Webページのロジックと構造を分離するため、submitイベントハンドラーをonsubmit属性にインラインで定義するよりも優れたソリューションだと思います。ロジックがHTMLから分離されているプロジェクトを維持する方がはるかに簡単です。参照:邪魔にならないJavaScript

DOMオブジェクトの.onsubmitプロパティを使用すると、form1つの要素に複数の送信コールバックをアタッチできなくなるため、お勧めできません。addEventListenerとonclickを 参照してください。


1
&jqueryの場合: $("button").click(function(e) { e.preventDefault() });
Nixen85

2
OPがボタンを変更できない(つまり、フォームも変更できないことを意味する)と述べたため、他のすべての回答がインラインのオンサブミットを引き続き使用する理由は+1とはいえません。ボタンIDがあれば「フォーム」を取得する方法があるかどうか疑問に思う
Robert Sinclair

16

これをお試しください...

HTMLコード

<form class="submit">
    <input type="text" name="text1"/>
    <input type="text" name="text2"/>
    <input type="submit" name="Submit" value="submit"/>
</form>

jQueryコード

$(function(){
    $('.submit').on('submit', function(event){
        event.preventDefault();
        alert("Form Submission stopped.");
    });
});

または

$(function(){
    $('.submit').on('submit', function(event){
       event.preventDefault();
       event.stopPropagation();
       alert("Form Submission prevented / stopped.");
    });
});

18
この質問にはjQueryタグがありません。
のMichałPerłakowski

6
@Gothdo、それでも解決策は同じです。クレイジーでしょ?
Kevin B

7
@Gothdoええ、それはまったく同じです。eventObject.preventDefault。ハンドラーをバインドする方法はソリューションを変更しません。私もあなたの答えは受け入れられたものと同じだと主張します。
Kevin B

stopPropagation私の場合、うまくいったのはそれだけでした。ありがとう!:)
cregox 2017年

13

以下は現在のところ機能します(chromeとfirefoxでテスト済み):

<form onsubmit="event.preventDefault(); return validateMyForm();">

ここで、validateMyForm()は、false検証が失敗した場合に返す関数です。重要なポイントは、名前を使用することですevent。例えばに使用できませんe.preventDefault()


1
onsubmit = "return validateMyForm();" 十分ですが、validateMyForm()はtrueまたはfalseを返します。
Adrian P.

8
var form = document.getElementById("idOfForm");
form.onsubmit = function() {
  return false;
}

2
1つの要素に.onsubmit複数のsubmitコールバックをアタッチできないため、使用することは悪い考えだと思います。の使用をお勧めし.addEventListener()ます。
のMichałPerłakowski

3
プロパティ.onsubmitを介してイベントハンドラーを設定した場合でも、.addEventListener()を介してハンドラーを追加できます。プロパティによって登録されたハンドラーが最初に呼び出され、次に.addEventListener()で登録されたハンドラーが登録順に呼び出されます。
Daniel Granger、

2

控えめなJavaScriptプログラミング規則に従うため、およびDOMのロード速度に応じて、以下を使用することをお勧めします。

<form onsubmit="return false;"></form>

次に、ライブラリを使用している場合は、onloadまたはDOM readyを使用してイベントを関連付けます。

$(function() {
    var $form = $('#my-form');
    $form.removeAttr('onsubmit');
    $form.submit(function(ev) {
        // quick validation example...
        $form.children('input[type="text"]').each(function(){
            if($(this).val().length == 0) {
                alert('You are missing a field');
                ev.preventDefault();
            }
        });
    });
});
label {
    display: block;
}

#my-form > input[type="text"] {
    background: cyan;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="my-form" action="http://google.com" method="GET" onsubmit="return false;">
    <label>Your first name</label>
    <input type="text" name="first-name"/>
    <label>Your last name</label>
    <input type="text" name="last-name" /> <br />
    <input type="submit" />
</form>

また、NoScriptactionなどのプラグインを実行していると検証が失敗する可能性があるため、常に属性を使用します。action属性を使用している場合、少なくともユーザーは、バックエンドの検証に基づいてサーバーによってリダイレクトされます。window.location一方、のようなものを使用している場合、状況は悪くなります。


2

フォームが送信されないようにするには、これを行うだけです。

<form onsubmit="event.preventDefault()">
    .....
</form>

上記のコードを使用することにより、これはフォームの送信を防ぎます。


0

ここに私の答え:

<form onsubmit="event.preventDefault();searchOrder(event);">
...
</form>
<script>
const searchOrder = e => {
    e.preventDefault();
    const name = e.target.name.value;
    renderSearching();

    return false;
}
</script>

私は追加event.preventDefault();onsubmit、それは動作します。


0

eventListnerをフォームに追加できます。 preventDefault()フォームデータをJSONに変換できます。

const formToJSON = elements => [].reduce.call(elements, (data, element) => {
  data[element.name] = element.value;
  return data;

}, {});

const handleFormSubmit = event => {
    event.preventDefault();
    const data = formToJSON(form.elements);
    console.log(data);
  //  const odata = JSON.stringify(data, null, "  ");
  const jdata = JSON.stringify(data);
    console.log(jdata);

    (async () => {
      const rawResponse = await fetch('/', {
        method: 'POST',
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        },
        body: jdata
      });
      const content = await rawResponse.json();

      console.log(content);
    })();
};

const form = document.forms['myForm']; 
form.addEventListener('submit', handleFormSubmit);
<form id="myForm" action="/" method="post" accept-charset="utf-8">
    <label>Checkbox:
        <input type="checkbox" name="checkbox" value="on">
    </label><br /><br />

    <label>Number:
        <input name="number" type="number" value="123" />
    </label><br /><br />

    <label>Password:
        <input name="password" type="password" />
    </label>
    <br /><br />

    <label for="radio">Type:
        <label for="a">A
            <input type="radio" name="radio" id="a" value="a" />
        </label>
        <label for="b">B
            <input type="radio" name="radio" id="b" value="b" checked />
        </label>
        <label for="c">C
            <input type="radio" name="radio" id="c" value="c" />
        </label>
    </label>
    <br /><br />

    <label>Textarea:
        <textarea name="text_area" rows="10" cols="50">Write something here.</textarea>
    </label>
    <br /><br />

    <label>Select:
        <select name="select">
            <option value="a">Value A</option>
            <option value="b" selected>Value B</option>
            <option value="c">Value C</option>
        </select>
    </label>
    <br /><br />

    <label>Submit:
        <input type="submit" value="Login">
    </label>
    <br /><br />


</form>

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