리디렉션없이 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.