フォームのリダイレクトを防ぐか、送信時に更新しますか?


96

たくさんのページを検索しましたが、問題が見つからないため、投稿する必要がありました。

送信ボタンのあるフォームがあり、送信したときに更新またはリダイレクトしないようにしたい。jQueryに機能を実行させたいだけです。

これがフォームです:

<form id="contactForm">
    <fieldset>
        <label for="Name">Name</label>
        <input id="contactName" type="text" />
    </fieldset>

    <fieldset>
        <label for="Email">Email</label>
        <input id="contactEmail" type="text" />
    </fieldset>

    <fieldset class="noHeight">
        <textarea id="contactMessage" cols="20"></textarea>
        <input id="contactSend" class="submit" type="submit" onclick="sendContactForm()" />
    </fieldset>
</form>        
<small id="messageSent">Your message has been sent.</small>

そしてここにjQueryがあります:

function sendContactForm(){
    $("#messageSent").slideDown("slow");
    setTimeout('$("#messageSent").slideUp();$("#contactForm").slideUp("slow")', 2000);
}

フォームのアクション要素を使用して、または使用せずに試しましたが、何が問題なのかわかりません。私をもっと苛立たせているのは、それを完全に行う例があるということです: 例ページ

私の問題をライブでご覧になりたい場合は、stormink.net(私のサイト)にアクセスし、サイドバーに「Send me and email」と「RSS Subscription」と書かれていることを確認してください。どちらも私がこれを機能させようとしているフォームです。

回答:


178

submitイベントでフォームの送信を処理し、falseを返すだけです。

$('#contactForm').submit(function () {
 sendContactForm();
 return false;
});

送信ボタンのonclickイベントはもう必要ありません。

<input class="submit" type="submit" value="Send" />

11
魅力のように働いた!そして何よりも速い!私はこのサイトが大好きです!どうもありがとうございます。
イアンストームテイラー

3
送信から送信しないでfalseを返す可能性があることを学んだ瞬間は、Javascript / DOMシステムが本当に好きになった瞬間でもあったことを覚えています。
イマジスト、

すごい。false提出を妨げる仕様ドキュメントはどこにありますか?
デビッド2015年

7
あなたは本当に...だけではなく、偽を返すのe.preventDefault()を使用する必要があります
フアン

3
@RogerFilmyerが間違っています。「return false;」を使用した場合 UXの問題を引き起こす伝播も停止します。たとえば、「クリック」が吹き上がることを期待している場合などです。
フアン

19

ここに:

function submitClick(e)
{
     e.preventDefault();
     $("#messageSent").slideDown("slow");
     setTimeout('$("#messageSent").slideUp();
     $("#contactForm").slideUp("slow")', 2000);
}

$(document).ready(function() {
    $('#contactSend').click(submitClick);
});

onClickイベントを使用する代わりに、jQueryを使用して 'click'イベントハンドラーを送信ボタン(または任意のボタン)にバインドし、submitClickをコールバックとして受け取ります。イベントをコールバックに渡してpreventDefaultを呼び出します。これにより、クリックがフォームを送信できなくなります。


$( '#contactSend')。click(submitClick(e)); 「e」は定義されていないと私には言われています。:/
David Da SilvaContín

3
あるべき$('#contactSend').click(function(e) { submitClick(e) });$('#contactSend').click(submitClick);
アーロン

14

フォームの開始タグで、次のようにアクション属性を設定します。

<form id="contactForm" action="#">

2
シンプルなソリューションの場合は+1。ただし、残念ながら、ユーザーが初めてEnterキーを押すと、ページは更新されます。悪い回避策はmyForm.submit();、できるだけ早く呼び出すことですが、その後、ページを2回ロードします。
cyclingLinguist

最初は更新されません。
Nearoo

この回答は元の質問を解決せず、ページの再読み込み後に実際にURLを変更することで状況を悪化させるため、投票には投票する必要があります。onsubmit関数で、e.preventDefault()またはin return falseで行う必要があります。stackoverflow.com/questions/19454310/...
ジェフ


6

たとえば、HTML属性によってトリガーされたデフォルトのブラウザーエラー(クライアントコードのJS処理の前に表示されるエラー)を表示する場合:

<input name="o" required="required" aria-required="true" type="text">

submitイベントの代わりにイベントを使用する必要がありますclick。この場合、「このフィールドに入力してください」を要求するポップアップが自動的に表示されます。でもpreventDefault

$('form').on('submit', function(event) {
   event.preventDefault();
   my_form_treatment(this, event);
}); // -> this will show up a "Please fill out this field" pop-up before my_form_treatment

誰かが先に述べたreturn false(フォームの送信に添付以上のハンドラがあるすなわち場合、彼らは実行されません)伝播を停止するだろうが、この場合には、ブラウザによってトリガアクションは常に最初に実行されます。return false最後にaがあっても。

したがって、これらのデフォルトのポップアップを削除するclick場合は、送信ボタンのイベントを使用します。

$('form input[type=submit]').on('click', function(event) {
   event.preventDefault();
   my_form_treatment(this, event);
}); // -> this will NOT show any popups related to HTML attributes

3

別の解決策は、フォームタグを使用せず、jqueryを通じて送信ボタンのクリックイベントを処理することです。このようにすると、ページが更新されることはありませんが、同時に送信用の「Enter」ボタンが機能せず、モバイルでは移動ボタン(一部のモバイルではスタイル)が表示されないという欠点があります。したがって、フォームタグの使用に固執し、受け入れられた回答を使用してください。

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