리디렉션없이 HTML 양식을 제출하는 방법


99

이런 형태가 있다면

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

JavaScript / jQuery로 다른보기로 리디렉션하지 않고 어떻게 제출할 수 있습니까?

Stack Overflow에서 많은 답변을 읽었지만 모두 POST 함수에서 반환 한 뷰로 리디렉션됩니다.


XHR 요청 (AJAX)을 원합니다
— Sterling Archer

2
XHR / AJAX는 한 가지 방법입니다. 게시물을 제출하고 백그라운드에서 응답을 받으므로 브라우저가 페이지를 떠나지 않습니다. 또 다른 방법은 게시물을 처리 한 후 서버 측 리디렉션으로, 사용중인 서버 기술에 따라 다릅니다.
— Stephen P

@StephenP 저는 ASP.NET MVC 5.1을 사용합니다.
— Duke Nuke 2014 년

@Duke, 내가 말하는 것은 둘 이상의 접근 방식 (ajax 대 서버 리디렉션)이 있으며 귀하의 선택은 귀하의 필요에 따라 다릅니다. 현대 사이트는 대부분 아약스를 원할 것입니다. 참고 또한이 모든 답이 말하는 것을 당신이 필요 jQuery의 큰하지만,이 - jQuery를 하다 내가 참으로 jQuery를 나 자신을 사용하지만, 다른 방법이 ... 아약스 할 사실.
— Stephen P

1
내 방식은 단순하고 깔끔하며 코드는 단 2 줄입니다. 스크립트를 사용하지 않으며 JavaScript가 꺼져 있어도 HTML4 이상에서 작동합니다.
— Issa Chanzi 2015

답변:


75

원하는 것을 얻으려면 아래와 같이 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()" })
— Duke Nuke 2014 년

이 작업은 다음과 같습니다.function SubForm (){ alert("1"); //e.preventDefault(); $.ajax({ url:'/Car/Edit/@Model.Id/', type:'post', data:$('#myForm').serialize(), success:function(){ alert("fasf"); } }); }
— Duke Nuke 2014 년

어떤 이유로 두 번째 솔루션이 작동하지 않았지만 마지막 댓글에 게시 한 솔루션이 작동했습니다. 나는 이것을 달성 할 수 있기 때문에 귀하의 게시물 원인에 내 솔루션을 추가 할 것입니다.
— Duke Nuke 2014 년

1
두 번째 방법도 작동해야하지만 다른 방법이있을 수 있지만 해결책을 찾았다면 지금 당장 그 길로 갈 필요가 없습니다! 다행이 도움)
— 아민 Jafari에게

덕분에 이 대답은 나를 제출 후 양식 대신에 사용자 정의 텍스트를 넣어 도움이
— Anupam

121

양식 action을 invisible 로 리디렉션하여이를 달성 할 수 있습니다 <iframe>. JavaScript 또는 다른 유형의 스크립트가 필요하지 않습니다.

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

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

1
이것은 훌륭합니다. 그러나 양식을 제출 한 후 어떻게해야합니까? 즉, 양식의 텍스트 필드는 비어 있어야하며 포커스는 첫 번째 필드로 돌아갑니다.?
— Pranjal Choladhara

2
그렇게 할 수있는 자바 스크립트가 있습니다. 그냥 변경 <input type='submit'...에 <input type='reset'추가합니다onclick='document.forms["myForm"].submit();'>
— 이싸 Chanzi에게

아름다운 대답! 좋은 작품
— Cybrus

양식이있는 페이지를 iframe에 다시로드 할 수 있으므로 앱이나 대규모 웹 사이트를 빌드하는 경우 성능 문제가 발생할 수 있습니다.
— Alexandre Daubricourt

24

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는 여전히 선택 사항입니다.
— Daniel De León

21

현재의 모든 답변은 iframe과 함께 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
정말 고맙습니다!
— Joshua Evans

나는 당신에게 내 모자를 기울입니다. contentType = false 매개 변수를 사용하여 nginx 백엔드에 양식을 전송하고 결과적으로 항상 415를 얻기 위해 jquery를 얻는 방법을 알아 내려고 몇 시간을 보냈습니다. 이것은 내 특정 문제를 해결 한 유일한 해결책이었습니다.
— user12066

8

좋아요, 마술적인 방법이 없기 때문에 말씀 드리지 않겠습니다. 양식 요소에 대한 작업 속성이 설정되어 있으면 리디렉션됩니다.

리디렉션을 원하지 않는 경우 작업을 설정하지 말고 onsubmit="someFunction();"

당신에 someFunction()당신은 (AJAX와 함께 여부), 당신이 원하는 무엇이든 할과 결말, 당신은 추가 return false;양식을 제출하지 브라우저에게 ...


1
마법 같은 방법이 있습니다. 양식이 현재 프레임이 아닌 다른 위치로 리디렉션되도록 대상 속성을 설정합니다. 페이지에 이와 같은 항목에 대해 보이지 않는 iframe을 추가하는 경우. 매우 간단합니다.
— Issa Chanzi 2015

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 년대의 코드처럼 보입니다. 나는 우리가 오랫동안 이것을 끝냈다 고 생각했습니다.
— Alfe

3

데이터가 multipart/form-data또는 application/x-www-form-urlencoded다음 과 같이 전송되지 않는 경우 2020 년부터 한 줄짜리 솔루션 :

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

3
이것을 OP와 결합하면 action="..."효과적으로 페이지 전환을 방지 할뿐만 아니라 네트워크를 통해 데이터가 제출되는 것을 방지합니다.
— Kev

@Kev 개인적으로 JS XHR을 통해 데이터를 보냅니다. 그래서 페이지 리디렉션을 원하지 않습니다. JS 앱이기 때문입니다
— Alexandre Daubricourt

@Kev 제가 언급 했어야했던 미안합니다
— Alexandre Daubricourt

2

jQuery의보기 post 기능을 .

버튼을 만들고 onClickListener($('#button').on('click', function(){}); )를 하고 함수에 데이터를 보냅니다.

또한 preventDefaultjQuery 의 기능을 참조하십시오 !


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

이 스 니펫을 사용하면 양식을 제출하고 리디렉션을 방지 할 수 있습니다. 대신 성공 함수를 인수로 전달하고 원하는대로 수행 할 수 있습니다.

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.