リダイレクトせずにHTMLフォームを送信する方法


95

このようなフォームがある場合、

<form action="/Car/Edit/17" id="myForm" method="post" name="myForm"> ... </form>

JavaScript / jQueryで別のビューにリダイレクトせずに送信するにはどうすればよいですか?

Stack Overflowからたくさんの回答を読みましたが、それらすべてがPOST関数によって返されたビューにリダイレクトします。


XHRリクエストが必要(AJAX)
Sterling Archer

2
XHR / AJAXは1つの方法です。投稿を送信し、舞台裏で応答を取得するため、ブラウザーは現在のページを離れることはありません。もう1つの方法は、投稿を処理した後のサーバー側リダイレクトです。これは、使用しているサーバーテクノロジーによって異なります。
スティーブンP

@StephenP ASP.NET MVC 5.1を使用しています。
Nuke Nuke

@Duke、私が言っているのは、複数のアプローチ(ajaxとserver-redirect)があり、どちらを選択するかはニーズによって異なります。最近のサイトは、おそらくajaxを実行したいと思うでしょう。注これらすべての答えは、あなたが言っているにもいることを必要とするのjQueryを- jQueryのは素晴らしいが、そこにある、私は実際にjQueryの自分自身を使用しても、AJAXを行うには、実際には、他の方法が...。
Stephen P

1
私のやり方はシンプルでクリーンでエレガントで、コードはたったの2行です。JavaScriptがオフになっている場合でも、スクリプトを使用せず、HTML4以上で動作します。
Issa Chanzi 2015

回答:


74

あなたが望むものを達成するためには、以下のようにjQuery Ajaxを使用する必要があります:

$('#myForm').submit(function(e){
    e.preventDefault();
    $.ajax({
        url: '/Car/Edit/17/',
        type: 'post',
        data:$('#myForm').serialize(),
        success:function(){
            // Whatever you want to do after the form is successfully submitted
        }
    });
});

これも試してください:

function SubForm(e){
    e.preventDefault();
    var url = $(this).closest('form').attr('action'),
    data = $(this).closest('form').serialize();
    $.ajax({
        url: url,
        type: 'post',
        data: data,
        success: function(){
           // Whatever you want to do after the form is successfully submitted
       }
   });
}

最終的解決

これは完璧に機能しました。私はこの関数をHtml.ActionLink(...)

function SubForm (){
    $.ajax({
        url: '/Person/Edit/@Model.Id/',
        type: 'post',
        data: $('#myForm').serialize(),
        success: function(){
            alert("worked");
        }
    });
}

これがうまくいった問題は、自動的に(常に)この方法で送信されたくないことです。あなたがあなたの回答に投稿したこのようなことを行う名前の関数が欲しいのですが。そのため、必要なときに手動で呼び出して、フォームにポストすることができます。以下のように、呼び出す関数の名前を指定できます。 @Html.ActionLink("Add a Report", "Create", "Reports", new { carId = Model.Id }, new { onclick = "FUNCTION_WHICH_SUBMITES_FORM()" })
デュークヌク2014

これは機能しました:function SubForm (){ alert("1"); //e.preventDefault(); $.ajax({ url:'/Car/Edit/@Model.Id/', type:'post', data:$('#myForm').serialize(), success:function(){ alert("fasf"); } }); }
デュークヌーク'22

何らかの理由で2番目のソリューションは機能しませんでしたが、私が最後のコメントで投稿したソリューションは機能しました。私がこれを達成できたという理由だけで、私の解決策をあなたの投稿に追加します。
デュークヌク2014

1
2つ目も同様に機能する必要がありますが、他にも何か問題があるかもしれませんが、解決策を見つけた場合は、今すぐにその道を進む必要はありません。それが助けてくれてうれしい;)
アミンジャファリ2014

おかげで、この答えはまた、私が提出した後、フォームの代わりにカスタムテキストを入れて助けた
アヌパム

116

これは、フォームactionを非表示にリダイレクトすることで実現でき<iframe>ます。JavaScriptやその他の種類のスクリプトは必要ありません。

<iframe name="dummyframe" id="dummyframe" style="display: none;"></iframe>

<form action="submitscript.php" target="dummyframe">
    <!-- Form body here -->
</form>

1
これは素晴らしい。しかし、フォームが送信された後、どうすればよいですか?つまり、フォームのテキストフィールドは空でなければならず、フォーカスは最初のフィールドに戻ります。
Pranjal Choladhara

1
それを実行できるjavascriptの種類があります。を変更し<input type='submit'...<input type='reset'追加するonclick='document.forms["myForm"].submit();'>
Issa Chanzi

美しい答え!素晴らしい作品
Cybrus

フォームが含まれているページをiframeに再読み込みする可能性があり、アプリや大きなウェブサイトを構築している場合は、パフォーマンスの問題が発生する可能性があります。
Alexandre Daubricourt

22

iFrameページの下部に隠線を配置targetし、フォームに配置します。

<iframe name="hiddenFrame" width="0" height="0" border="0" style="display: none;"></iframe>

<form action="/Car/Edit/17" id="myForm" method="post" name="myForm" target="hiddenFrame"> ... </form>

早くて簡単。このtarget属性はまだ広くサポートされています(HTML5でもサポートされています)が、HTML 4.01では推奨されていません。

ですから、将来を見据えてAjaxを使用する必要があります。


MDNによると、この動作targetは完全に有効であるため、AJAXはオプションです。
ダニエルデレオン

18

現在のすべての回答はiQueryでjQueryまたはトリックを使用しているため、単純なJavaScriptのみでメソッドを追加しても害はないと考えました。

function formSubmit(event) {
  var url = "/post/url/here";
  var request = new XMLHttpRequest();
  request.open('POST', url, true);
  request.onload = function() { // request successful
  // we can use server response to our request now
    console.log(request.responseText);
  };

  request.onerror = function() {
    // request failed
  };

  request.send(new FormData(event.target)); // create FormData from form that triggered event
  event.preventDefault();
}

// and you can attach form submit event like this for example
function attachFormSubmitEvent(formId){
  document.getElementById(formId).addEventListener("submit", formSubmit);
}

2
どうもありがとうございます!
ジョシュアエヴァンス

私は帽子をあなたに傾けます。contentType = falseパラメータを使用してjqueryがフォームをnginxバックエンドに送信し、結果として常に415を取得する方法を理解するために何時間も費やしてきました。これは、私の特定の問題を解決した唯一の解決策でした。
user12066

7

わかりません。魔法の方法はありませんので、説明しません。フォーム要素にアクション属性が設定されている場合は、リダイレクトされます。

リダイレクトしたくない場合は、アクションを設定せずに設定してください onsubmit="someFunction();"

あなたにはsomeFunction()、あなたが(AJAXまたはしない)、あなたがやりたいとエンディングでは、追加return false;のフォームを提出していないブラウザを教えて...


1
それを行うには魔法の方法があります。フォームが現在のフレーム以外の場所にリダイレクトされるように、ターゲット属性を設定します。このようなものにページに非表示のiframeを追加した場合。とても簡単です。
Issa Chanzi

5

それを実現するには、Ajaxが必要です。このようなもの:

$(document).ready(function(){
    $("#myform").on('submit', function(){
        var name = $("#name").val();
        var email = $("#email").val();
        var password = $("#password").val();
        var contact = $("#contact").val();

        var dataString = 'name1=' + name + '&email1=' + email + '&password1=' + password + '&contact1=' + contact;
        if(name=='' || email=='' || password=='' || contact=='')
        {
            alert("Please fill in all fields");
        }
        else
        {
            // Ajax code to submit form.
            $.ajax({
                type: "POST",
                url: "ajaxsubmit.php",
                data: dataString,
                cache: false,
                success: function(result){
                    alert(result);
                }
           });
        }
        return false;
    });
});

5
このソースコードをインデントしない特別な理由はありますか?Cが発明される前の60年代のコードのように見えます。長い間これでおしまいだと思いました。
2016

2

jQueryのpost関数を参照してください。

ボタンを作成してonClickListener$('#button').on('click', function(){});)を設定し、関数でデータを送信します。

また、preventDefaultjQuery の関数もご覧ください。


2

データがmultipart/form-dataまたはとして送信されることを意図していない場合、2020年時点のワンライナーソリューションapplication/x-www-form-urlencoded

<form onsubmit='return false'>
    <!-- ... -->           
</form>

3
これをOPと組み合わせると、action="..."ページ切り替えが効果的に防止されますが、ネットワーク経由でデータが送信されることも防止されます。
ケブ

@Kev私はJS XHRを介して自分のデータを個人的に送信します。これが、ページリダイレクトを望まない理由です。これは、JSアプリです
Alexandre Daubricourt

@Kev申し訳ありませんが、私はそのことを述べるべきでした
Alexandre Daubricourt

1

ここで説明するように、送信ボタンをフォームの外に移動しても、目的の効果を得ることができます。

フォーム送信時のページの再読み込みとリダイレクトを防止するajax / jquery

このような:

<form id="getPatientsForm">
    Enter URL for patient server
    <br/><br/>
    <input name="forwardToUrl" type="hidden" value="/WEB-INF/jsp/patient/patientList.jsp" />
    <input name="patientRootUrl" size="100"></input>
    <br/><br/>
</form>

<button onclick="javascript:postGetPatientsForm();">Connect to Server</button>

1

このスニペットを使用すると、フォームを送信してリダイレクトを回避できます。代わりに、success関数を引数として渡して、好きなことを行うことができます。

function submitForm(form, successFn){
    if (form.getAttribute("id") != '' || form.getAttribute("id") != null){
        var id = form.getAttribute("id");
    } else {
        console.log("Form id attribute was not set; the form cannot be serialized");
    }

    $.ajax({
        type: form.method,
        url: form.action,
        data: $(id).serializeArray(),
        dataType: "json",
        success: successFn,
        //error: errorFn(data)
    });
}

そして、ただやる:

var formElement = document.getElementById("yourForm");
submitForm(formElement, function() {
    console.log("Form submitted");
});

0

バックエンドを制御する場合は、のresponse.redirect代わりになどを使用してくださいresponse.send

このためのカスタムHTMLページを作成するか、すでに持っているものにリダイレクトすることができます。

Express.jsの場合:

const handler = (req, res) => {
  const { body } = req
  handleResponse(body)
  .then(data => {
    console.log(data)
    res.redirect('https://yoursite.com/ok.html')
  })
  .catch(err => {
    console.log(err)
    res.redirect('https://yoursite.com/err.html')
  })
}
...
app.post('/endpoint', handler)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.