Enterキーを押してWebフォームを送信するのを防ぐ方法は?


207

ENTERキーを押してWebベースのアプリケーションでフォームを送信しないようにするにはどうすればよいですか?

回答:


99

[ リビジョン 2012、インラインハンドラーなし、textareaの入力処理を保持]

function checkEnter(e){
 e = e || event;
 var txtArea = /textarea/i.test((e.target || e.srcElement).tagName);
 return txtArea || (e.keyCode || e.which || e.charCode || 0) !== 13;
}

これで、フォームにキープレスハンドラーを定義できます:
<form [...] onkeypress = "return checkEnter(event)">

document.querySelector('form').onkeypress = checkEnter;

3
ちなみに、テキストエリアを除外するために、checkEnter関数に入力タイプのチェック(イベントソース経由)を追加できます。
KooiInc 2009

1
動作します。<enter>がフォームを送信しないようにするため、これを単一の入力に追加しました。内部検索を実行するボタンがあり、実際に使いやすさが向上しています。
Foxinni 2012

1
この方法(フォーム全体のイベントハンドラーでこの関数を使用)の1つの問題は、フォーム内にもあるテキスト領域(通常は入力が望ましい場所)で入力が発生しないことです。
ロニーベスト

1
@LonnieBest:お知らせいただきありがとうございます。あなたがやった(上記参照)この回答への私のコメントを読んで、あなたがやりましたか?とにかく、私はこのかなり古い答えを修正しました。
KooiInc

1
@ジョナサン:フォーム全体ではなく、単一の入力フィールドまたは入力フィールドのコレクション(ボタンではない)を含むdivにハンドラーをアタッチできます。
KooiInc 2013年

57

Enter送信を停止し、バックスペースキーを停止するために使用できるjQueryハンドラーを次に示します->戻る。「keyStop」オブジェクトの(keyCode:selectorString)ペアは、デフォルトのアクションを起動してはならないノードを一致させるために使用されます。

Webはアクセシブルな場所である必要があることを忘れないでください。これはキーボードユーザーの期待に反しています。とは言っても、私の場合、私が取り組んでいるWebアプリケーションはとにかく戻るボタンが気に入らないので、キーショートカットを無効にしても問題ありません。「入力する->提出する」の議論は重要ですが、実際に尋ねられた質問とは関係ありません。

これがアクセシビリティについて考えるあなた次第のコードであり、なぜあなたが実際にこれをしたいのか!

$(function(){
 var keyStop = {
   8: ":not(input:text, textarea, input:file, input:password)", // stop backspace = back
   13: "input:text, input:password", // stop enter = submit 

   end: null
 };
 $(document).bind("keydown", function(event){
  var selector = keyStop[event.which];

  if(selector !== undefined && $(event.target).is(selector)) {
      event.preventDefault(); //stop event
  }
  return true;
 });
});

12
最も簡単な方法:$( "#myinput")。keydown(function(e){if(e.which == 13)e.preventDefault();}); 重要なのは、「keydown」とevent.preventDefault()を一緒に使用することです。「キーアップ」では機能しません。
レペ

これは、ブラウザの自動提案が適切に機能し続けるキー13を単にブロックする他のソリューションよりも優れています。
jsalvata

52

onsubmitハンドラから単にfalseを返す

<form onsubmit="return false;">

または、途中でハンドラが必要な場合

<script>
var submitHandler = function() {
  // do stuff
  return false;
}
</script>
<form onsubmit="return submitHandler()">

5
これが最も簡単な答えのようです。Google Chromeで試してみましたが、問題なく動作しました。すべてのブラウザでこれをテストしましたか?
スタイル

22
submitボタンを押してフォームを送信する場合、これはお勧めできません
AliBZ

13
送信ボタンがフォームを送信しなくなったため機能しません
paullb

39
@Paul、これはどのようにして38票を獲得しましたか?停止<form>提出し得ることから、すべてのことは風呂で赤ちゃんを投げています。
Pacerier 2015年

8
@Pacerier SPAのコンテキストでは、ほとんどの場合、フォームの送信を手動で処理する必要があります。この場合、ブラウザーによるフォームの送信(およびアプリケーションを再起動するページの更新)を常に停止するのが妥当です。
Nathan Friend

44
//Turn off submit on "Enter" key

$("form").bind("keypress", function (e) {
    if (e.keyCode == 13) {
        $("#btnSearch").attr('value');
        //add more buttons here
        return false;
    }
});

5
これはうまくいきます。同じ目的を達成するのではe.preventDefault()なくreturn false、イベントが親要素のハンドラーに到達できるようにします。デフォルトのアクション(フォームサミット)は引き続き防止されます
記者発表2014年

24

フォームのデフォルトの送信動作をキャンセルするだけで、この関数を呼び出す必要があります。任意の入力フィールドまたはイベントに添付できます。

function doNothing() {  
var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
    if( keyCode == 13 ) {


    if(!e) var e = window.event;

    e.cancelBubble = true;
    e.returnValue = false;

    if (e.stopPropagation) {
        e.stopPropagation();
        e.preventDefault();
    }
}

2
eは引数である必要があり、次にwindow.eventを確認する必要があります。また、イベントからキーコードを取得する必要があります。最後に、falseを返す必要があります。
ntownsend 2010年

9
この関数をどこでどのように呼び出すか説明できますか?
mydoghasworms 2011

17

ENTERキーは、フォームのデフォルトの送信ボタンをアクティブにするだけで、最初のボタンになります

<input type="submit" />

ブラウザはフォーム内で検索します。

したがって、送信ボタンはありませんが、次のようなもの

<input type="button" value="Submit" onclick="submitform()" /> 

編集:コメントでの議論に応じて:

これは、テキストフィールドが1つしかない場合は機能しませんが、その場合は望ましい動作である可能性があります。

もう1つの問題は、フォームを送信するためにJavaScriptに依存していることです。これは、アクセシビリティの観点から問題になる可能性があります。これは<input type='button'/>、JavaScriptでを記述し<input type='submit' /><noscript>タグ内にを配置することで解決できます。このアプローチの欠点は、JavaScriptが無効なブラウザーの場合、ENTERでフォームを送信できることです。この場合の望ましい動作を決定するのはOPです。

JavaScriptをまったく呼び出さずにこれを行う方法はありません。


奇妙なことに、フィールドが1つしかない場合、これはFirefoxでは機能しません。
DanSingerman 2009

5
アクセシビリティにひどい?多分。しかし、それ彼らの男の質問に答えます、それはSOが何であるかです...たぶん、アクセシビリティの問題を指摘するために答えを編集することは良い妥協でしょうか?
Neil Barnwell

1
@bobince-おそらくアクセシビリティのため、質問は-1に値しますが、質問に対するこの正確な答えは?そう思わないでください。また、これを実行したい有効なユースケースがあります。
DanSingerman 2009

ただし、JavaScriptがなければフォームを送信できないようにする必要はありません。これは機能するのですが、ブラウザが送信ボタンを含まないフォームを喜んで送信するため、機能しません。
ボビンス

2
これらすべてとOperaで1つのテキスト入力と1つの入力ボタンを使用してテストされました。Enterの問題を「解決」するにはJavaScriptが明らかに必要ですが、トリックは、JSが利用できない場合にページを完全に動作不能にしないようにすることです。
ボビンス2009

13

純粋なJavascriptの簡単な答えは次のとおりです。

<script type="text/javascript">
    window.addEventListener('keydown', function(e) {
        if (e.keyIdentifier == 'U+000A' || e.keyIdentifier == 'Enter' || e.keyCode == 13) {
            if (e.target.nodeName == 'INPUT' && e.target.type == 'text') {
                e.preventDefault();
                return false;
            }
        }
    }, true);
</script>

これは、入力type = 'text'の「Enter」キープレスアクションのみを無効にします。訪問者は引き続きWebサイト全体で「Enter」キーを使用できます。

他のアクションでも「Enter」を無効にしたい場合は、console.log(e);を追加できます。テスト目的で、ChromeでF12を押し、「コンソール」タブに移動して、ページの「バックスペース」を押し、その中を調べて返される値を確認します。次に、これらのすべてのパラメーターをターゲットにして、コードをさらに拡張できます。上記の「e.target.nodeName」「e.target.type」などのニーズに合わせて...

ここで同様の質問の詳細な回答を参照してください


3
実際にはそうなるはずですe.target.nodeName === 'INPUT' && e.target.type !== 'textarea'。指定されたコードを使用すると、ラジオまたはチェックボックスがフォーカスされている場合にフォームを送信できます。
afnpires 2016年

1
これは最も効果的でリソースに優しいソリューションです。@AlexandrePiresにありがとう!これが私の完全な作業スクリプトです:stackoverflow.com/a/40686327/1589669
eapo '18年

1
唯一の実用的なソリューション。少なくとも私の状況では。
hex494D49

9

この件、ここまたは他の投稿で私が見つけたすべての回答には1つの欠点があります。それは、フォーム要素の実際の変更トリガーも防ぐことです。したがって、これらのソリューションを実行した場合、onchangeイベントもトリガーされません。この問題を克服するために、私はこれらのコードを変更し、次のコードを自分で開発しました。これが他の人にも役立つことを願っています。「prevent_auto_submit」フォームにクラスを指定し、次のJavaScriptを追加しました。

$(document).ready(function() 
{
    $('form.prevent_auto_submit input,form.prevent_auto_submit select').keypress(function(event) 
    { 
        if (event.keyCode == 13)
        {
            event.preventDefault();
            $(this).trigger("change");
        }
    });
});

7

私は以前、上記のようなキープレスハンドラーで常にそれを行ってきましたが、今日はより簡単な解決策を見つけました。Enterキーは、フォーム上の最初の無効になっていない送信ボタンをトリガーするだけなので、実際に必要なのは、送信しようとしているボタンをインターセプトすることだけです。

<form>
  <div style="display: none;">
    <input type="submit" name="prevent-enter-submit" onclick="return false;">
  </div>
  <!-- rest of your form markup -->
</form>

それでおしまい。キープレスは通常どおりブラウザ/フィールド/などによって処理されます。Enter-Submitロジックがトリガーされると、ブラウザは非表示の送信ボタンを見つけてトリガーします。そして、JavaScriptハンドラーが送信を阻止します。


1
通常私はハックは好きではありませんが、これは本当に効果的です。
TechWisdom

1
divを削除しhiddenて入力にattr を置くだけの方が短いでしょう。素敵なハック:)
Nik

5

IE8、9、10、Opera 9 +、Firefox 23、Safari(PC)、Safari(MAC)用のこのクロスブラウザーを作成するのに少し時間を費やしました

JSFiddleの例: http

基本コード-フォームに添付された「onkeypress」を介してこの関数を呼び出し、それに「window.event」を渡します。

function stopEnterSubmitting(e) {
    if (e.keyCode == 13) {
        var src = e.srcElement || e.target;
        if (src.tagName.toLowerCase() != "textarea") {
            if (e.preventDefault) {
                e.preventDefault();
            } else {
                e.returnValue = false;
            }
        }
    }
}

4
stopSubmitOnEnter (e) {
  var eve = e || window.event;
  var keycode = eve.keyCode || eve.which || eve.charCode;

  if (keycode == 13) {
    eve.cancelBubble = true;
    eve.returnValue = false;

    if (eve.stopPropagation) {   
      eve.stopPropagation();
      eve.preventDefault();
    }

    return false;
  }
}

次に、フォームで:

<form id="foo" onkeypress="stopSubmitOnEnter(e);">

ただし、邪魔なJavaScriptを使用しない方がよいでしょう。


@hashよりも読みやすいので、このバージョンが好きです。ただし、1つの問題として、「if(keycode == 13)」ブロック内でfalseを返す必要があります。お持ちのように、この関数はフィールドでのキーボード入力を防ぎます。また、@ hashのバージョンにはe.keyCode、e.which、e.charCodeが含まれています... e.charCodeが重要かどうかはわかりませんが、とにかくそこに配置します: "var keycode = eve.keyCode || eve.which || eve.charCode;」。
ジャックセネシャル

ありがとう、ジャック。確認のために回答を編集しましたcharCodereturn falseifブロックの内側も移動しました。良いキャッチ。
ntownsend

3

私の場合、このjQuery JavaScriptは問題を解決しました

jQuery(function() {
            jQuery("form.myform").submit(function(event) {
               event.preventDefault();
               return false;
            });
}

素晴らしい、@カービーに感謝!Enterキーがフォームで無効になっているので<input>、フォーム内のすべてのフィールドでEnterキーを有効にするにはどうすればよいでしょうか。
イアンキャンベル

3

「ENTER」を押してフォームを送信できないようにすると、一部のユーザーに不便を与える可能性があります。そのため、以下の手順に従うとよいでしょう。

'onSubmit'イベントをフォームタグに記述します。

<form name="formname" id="formId" onSubmit="return testSubmit()" ...>
 ....
 ....
 ....
</form>

JavaScript関数を次のように記述します。

function testSubmit(){
  if(jQuery("#formId").valid())
      {
        return true;
      }
       return false;

     } 

     (OR)

理由が何であれ、Enterキーを押したときにフォームが送信されないようにするには、JavaScriptで次の関数を記述します。

    $(document).ready(function() {
          $(window).keydown(function(event){
          if(event.keyCode == 13) {
               event.preventDefault();
               return false;
              }
           });
         });

ありがとう。


3

このタグをフォームに追加します- onsubmit="return false;" フォームを送信できるのは、いくつかのJavaScript関数のみです。


OP(このブラウザ機能に噛まれたほとんどの人と同様)は、おそらくマウスクリックでの送信を引き続き許可したいと考えていました。これを解決する良い方法はありませんが、たとえばAdamからの(現時点での)上記の回答の方がうまくいきます。
Sz。

3

またはを押しenterたときにフォームの送信を防ぐにはtextareainputフィールドをは、送信イベントをチェックして、イベントを送信した要素のタイプを確認します。

例1

HTML

<button type="submit" form="my-form">Submit</button>
<form id="my-form">
...
</form>

jQuery

$(document).on('submit', 'form', function(e) {
    if (e.delegateTarget.activeElement.type!=="submit") {
        e.preventDefault();
    }
});

より良い解決策は、送信ボタンがなく、通常のボタンでイベントを発生させる場合です。最初の例では2つの送信イベントが発生しますが、2番目の例では1つの送信イベントのみが発生するため、これはより良い方法です。

例2

HTML

<button type="button" onclick="$('#my-form').submit();">Submit</button>
<form id="my-form">
...
</form>

jQuery

$(document).on('submit', 'form', function(e) {
    if (e.delegateTarget.activeElement.localName!=="button") {
        e.preventDefault();
    }
});

3

あなたはこれがよりシンプルで便利であることがわかります:D

$(document).on('submit', 'form', function(e){
    /* on form submit find the trigger */
    if( $(e.delegateTarget.activeElement).not('input, textarea').length == 0 ){
        /* if the trigger is not between selectors list, return super false */
        e.preventDefault();
        return false;
    } 
});

2

どうですか:

<asp:Button ID="button" UseSubmitBehavior="false"/>

2

この記事を確認して、Enterキーを押してWebフォームを送信できないようにする方法を教えてください

$(“.pc_prevent_submit”).ready(function() {
  $(window).keydown(function(event) {
    if (event.keyCode == 13) {
      event.preventDefault();
      return false;
    }
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form class=”pc_prevent_submit” action=”” method=”post”>
  <input type=”text” name=”username”>
  <input type=”password” name=”userpassword”>
  <input type=”submit” value=”submit”>
</form>


1

JavaScriptでフォームのキーダウンをトラップして、バブリングさえ防ぐことができると思います。WebページでEnterキーを押すと、基本的には、現在選択されているコントロールが配置されているフォームが送信されます。


コントロールによって異なります;)textareaで次の行に移動します。したがって、すべての「Enter」キープレスイベントをキャッチすることはお勧めできません。
ケンダー

おそらく、その場合、フォームにはとにかくキーダウンイベントがありますか?
Neil Barnwell、

すべてのinput-type-textおよび他の同様のコントロールで直接実行します。それは少し苦痛であり、ほとんどの場合本当に気にする価値はありませんが、もし必要なら...
bobince

1

このリンクは、Chrome、FF、およびIE9で動作するソリューションに加えて、IE9の開発者ツール(F12)に付属するIE7および8のエミュレーターを提供します。

http://webcheatsheet.com/javascript/disable_enter_key.php


リンクが壊れている場合は、このコードをページのヘッダー領域に追加してください。 <script type="text/javascript"> function stopRKey(evt) { var evt = (evt) ? evt : ((event) ? event : null); var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null); if ((evt.keyCode == 13) && (node.type=="text")) {return false;} } document.onkeypress = stopRKey; </script>
Miaka

1

別のアプローチは、フォームが送信されることになっている場合にのみフォームに送信入力ボタンを追加し、フォーム入力中に単純なdivに置き換えることです。


1

この属性をFORMタグに追加するだけです。

onsubmit="return gbCanSubmit;"

次に、SCRIPTタグに次を追加します。

var gbCanSubmit = false;

次に、ボタンを作成するか、その他の理由(関数など)で最終的に送信を許可する場合は、次の例のように、グローバルブール値を反転して.submit()呼び出しを実行します。

function submitClick(){

  // error handler code goes here and return false if bad data

  // okay, proceed...
  gbCanSubmit = true;
  $('#myform').submit(); // jQuery example

}

1

'name'の値が異なる複数の送信ボタンがあり、送信時に同じphpファイルで異なる処理を実行するため、私はこれに遭遇しました。enter/ returnこれらの値が提出されていないとボタンはこれを破ります。それで私は考えていました、enter/ returnボタンはフォームの最初の送信ボタンをアクティブにしますか?これにより、非表示の「バニラ」送信ボタンや、実行中のphpファイルをフォームが含まれるページに戻す「名前」値を持つことができます。または、キープレスがアクティブにするデフォルト(非表示)の「名前」値、および送信ボタンが独自の「名前」値で上書きします。ちょっとした考え。


1

どうですか:

<script>
function isok(e) {
  var name = e.explicitOriginalTarget.name;
  if (name == "button") {
    return true
  }
  return false;
}
</script>
<form onsubmit="return isok(event);">
<input type="text" name="serial"/>
<input type="submit" name="button" value="Create Thing"/>
</form>

ボタンに正しい名前を付けるだけで送信されますが、テキストフィールド、つまり、returnを押したときのexplicitOriginalTargetには正しい名前がありません。


0

これでうまくいきました。
onkeydown = "return!(event.keyCode == 13)"

    <form id="form1" runat="server" onkeydown="return !(event.keyCode==13)">

   </form>

1
テキストエリアがある場合、同じフォームでEnterキーを押すと次の行にジャンプできません
Aamir Afridi

0

ここに私がそれをする方法があります:

window.addEventListener('keydown', function(event)
{
    if (event.key === "Enter")
    {
        if(event.target.type !== 'submit')
        {
            event.preventDefault();
            return false;
        }
    }
}

-1

JavaScript外部ファイルに入れます

   (function ($) {
 $(window).keydown(function (event) {  

    if (event.keyCode == 13) {

        return false;
    }
});

 })(jQuery);

またはbodyタグ内のどこかに

<script>


$(document).ready(function() {
    $(window).keydown(function(event) {
        alert(1);

        if(event.keyCode == 13) {

            return false;
        }
    });
});

</script>

-2

私は同じ問題を抱えていました(大量のテキストフィールドと未熟練ユーザーのフォーム)。

私はこのようにそれを解決しました:

function chkSubmit() {
    if (window.confirm('Do you want to store the data?')) {
        return true;
    } else {
        // some code to focus on a specific field
        return false;
    }
}

これをHTMLコードで使用します。

<form
    action="go.php" 
    method="post"
    accept-charset="utf-8"  
    enctype="multipart/form-data"
    onsubmit="return chkSubmit()"
>

このようにして、ENTERキーは計画どおりに機能しますが、確認(2番目ENTER通常はタップ)が必要です。

私は読者ENTERに、フォームに留まることにした場合に押したフィールドでユーザーを送るスクリプトの探求を任せます。

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