jQuery AJAX 제출 양식

이름 orderproductForm과 정의되지 않은 수의 입력 양식 이 있습니다.

어떤 종류의 jQuery.get 또는 ajax 또는 Ajax를 통해 페이지를 호출하고 양식의 모든 입력을 전송하는 것과 같은 것을하고 싶습니다 orderproductForm.

한 가지 방법은 다음과 같은 것을하는 것이라고 생각합니다.

jQuery.get("myurl",
          {action : document.orderproductForm.action.value,
           cartproductid : document.orderproductForm.cartproductid.value,
           productid : document.orderproductForm.productid.value,
           ...

그러나 모든 양식 입력을 정확히 알지는 못합니다. 모든 양식 입력을 보내는 기능, 기능 또는 무언가가 있습니까?



답변

Ajax Form Plugin 또는 jQuery serialize 함수 에서 ajaxForm / ajaxSubmit 함수를 사용할 수 있습니다 .

AjaxForm :

$("#theForm").ajaxForm({url: 'server.php', type: 'post'})

또는

$("#theForm").ajaxSubmit({url: 'server.php', type: 'post'})

제출 단추를 누르면 ajaxForm이 전송됩니다. ajaxSubmit이 즉시 보냅니다.

직렬화 :

$.get('server.php?' + $('#theForm').serialize())

$.post('server.php', $('#theForm').serialize())

AJAX 직렬화 문서는 여기에 있습니다 .


답변

이것은 간단한 참조입니다.

// this is the id of the form
$("#idForm").submit(function(e) {

    e.preventDefault(); // avoid to execute the actual submit of the form.

    var form = $(this);
    var url = form.attr('action');

    $.ajax({
           type: "POST",
           url: url,
           data: form.serialize(), // serializes the form's elements.
           success: function(data)
           {
               alert(data); // show response from the php script.
           }
         });


});

도움이 되길 바랍니다.


답변

양식 요소에 정의 된 속성을 사용하는 다른 유사한 솔루션 :

<form id="contactForm1" action="/your_url" method="post">
    <!-- Form input fields here (do not forget your name attributes). -->
</form>

<script type="text/javascript">
    var frm = $('#contactForm1');

    frm.submit(function (e) {

        e.preventDefault();

        $.ajax({
            type: frm.attr('method'),
            url: frm.attr('action'),
            data: frm.serialize(),
            success: function (data) {
                console.log('Submission was successful.');
                console.log(data);
            },
            error: function (data) {
                console.log('An error occurred.');
                console.log(data);
            },
        });
    });
</script>

답변

명심해야 할 것이 몇 가지 있습니다.

1. 양식을 제출하는 방법에는 여러 가지가 있습니다

  • 제출 버튼 사용
  • Enter를 눌러
  • JavaScript에서 제출 이벤트를 트리거하여
  • 장치 또는 향후 장치에 따라 더 많을 수 있습니다.

따라서 버튼 클릭 이벤트가 아닌 양식 제출 이벤트에 바인딩해야합니다 . 이를 통해 현재와 미래의 모든 장치 및 보조 기술에서 코드가 작동합니다.

2. 히잡

사용자가 JavaScript를 활성화하지 않았을 수 있습니다. hijax의 패턴은 우리가 부드럽게 자바 스크립트를 사용하여 양식의 컨트롤을하지만, 자바 스크립트가 실패하는 경우가 submittable 떠날 경우, 여기 좋다.

양식에서 URL과 메소드를 가져와야하므로 HTML이 변경되면 JavaScript를 업데이트 할 필요가 없습니다.

3. 눈에 띄지 않는 JavaScript

사용 에서는 event.preventDefault () 대신 반환 거짓은 그것이 거품까지 이벤트를 허용하는 것이 좋습니다. 이를 통해 다른 스크립트 (예 : 사용자 상호 작용을 모니터링하는 분석 스크립트)를 이벤트에 연결할 수 있습니다.

속도

스크립트를 인라인으로 삽입하는 대신 외부 스크립트를 사용하는 것이 이상적입니다. 스크립트 태그를 사용하여 페이지의 헤드 섹션에 링크하거나 페이지 하단의 링크를 통해 속도를 높일 수 있습니다. 스크립트는 방해받지 않고 사용자 경험을 조용히 향상시켜야합니다.

암호

위의 모든 내용에 동의하고 제출 이벤트를 잡고 AJAX (hijax 패턴)를 통해 처리하려는 경우 다음과 같이 할 수 있습니다.

$(function() {
  $('form.my_form').submit(function(event) {
    event.preventDefault(); // Prevent the form from submitting via the browser
    var form = $(this);
    $.ajax({
      type: form.attr('method'),
      url: form.attr('action'),
      data: form.serialize()
    }).done(function(data) {
      // Optionally alert the user of success here...
    }).fail(function(data) {
      // Optionally alert the user of an error here...
    });
  });
});

다음을 사용하여 JavaScript를 통해 원할 때마다 양식 제출을 수동으로 트리거 할 수 있습니다.

$(function() {
  $('form.my_form').trigger('submit');
});

편집하다:

나는 최근에 이것을해야했고 플러그인을 작성하게되었습니다.

(function($) {
  $.fn.autosubmit = function() {
    this.submit(function(event) {
      event.preventDefault();
      var form = $(this);
      $.ajax({
        type: form.attr('method'),
        url: form.attr('action'),
        data: form.serialize()
      }).done(function(data) {
        // Optionally alert the user of success here...
      }).fail(function(data) {
        // Optionally alert the user of an error here...
      });
    });
    return this;
  }
})(jQuery)

data-autosubmit 속성을 양식 태그에 추가하면 다음을 수행 할 수 있습니다.

HTML

<form action="/blah" method="post" data-autosubmit>
  <!-- Form goes here -->
</form>

JS

$(function() {
  $('form[data-autosubmit]').autosubmit();
});

답변

FormData 를 사용할 수도 있습니다 (하지만 IE에서는 사용할 수 없음).

var formData = new FormData(document.getElementsByName('yourForm')[0]);// yourForm: form selector        
$.ajax({
    type: "POST",
    url: "yourURL",// where you wanna post
    data: formData,
    processData: false,
    contentType: false,
    error: function(jqXHR, textStatus, errorMessage) {
        console.log(errorMessage); // Optional
    },
    success: function(data) {console.log(data)}
});

이것이 FormData 를 사용하는 방법 입니다.


답변

단순 버전 (이미지를 보내지 않음)

<form action="/my/ajax/url" class="my-form">
...
</form>
<script>
    (function($){
        $("body").on("submit", ".my-form", function(e){
            e.preventDefault();
            var form = $(e.target);
            $.post( form.attr("action"), form.serialize(), function(res){
                console.log(res);
            });
        });
    )(jQuery);
</script>

페이지의 양식 또는 모든 양식의 아약스를 복사하여 붙여 넣기

Alfrekjv의 답변 이 수정 된 버전입니다.

  • jQuery> = 1.3.2에서 작동합니다.
  • 문서가 준비되기 전에 실행할 수 있습니다
  • 양식을 제거했다가 다시 추가해도 여전히 작동합니다
  • 양식의 “action”속성에 지정된 일반 양식과 동일한 위치에 게시됩니다.

자바 스크립트

jQuery(document).submit(function(e){
    var form = jQuery(e.target);
    if(form.is("#form-id")){ // check if this is the form that you want (delete this check to apply this to all forms)
        e.preventDefault();
        jQuery.ajax({
            type: "POST",
            url: form.attr("action"),
            data: form.serialize(), // serializes the form's elements.
            success: function(data) {
                console.log(data); // show response from the php script. (use the developer toolbar console, firefox firebug or chrome inspector console)
            }
        });
    }
});

Alfrekjv의 답변을 편집하고 싶었지만 너무 많이 벗어 났으므로 이것을 별도의 답변으로 게시하기로 결정했습니다.

파일을 보내지 않고 단추를 지원하지 않습니다 (예 : 제출 단추 포함).

버튼을 지원하기 위해 제출 대신 실제 버튼 클릭을 캡처 할 수 있습니다.

jQuery(document).click(function(e){
    var self = jQuery(e.target);
    if(self.is("#form-id input[type=submit], #form-id input[type=button], #form-id button")){
        e.preventDefault();
        var form = self.closest('form'), formdata = form.serialize();
        //add the clicked button to the form data
        if(self.attr('name')){
            formdata += (formdata!=='')? '&':'';
            formdata += self.attr('name') + '=' + ((self.is('button'))? self.html(): self.val());
        }
        jQuery.ajax({
            type: "POST",
            url: form.attr("action"),
            data: formdata,
            success: function(data) {
                console.log(data);
            }
        });
    }
});

서버 측 에서 jquery
가 PHP로 설정하는이 헤더 로 아약스 요청감지 할 수 있습니다HTTP_X_REQUESTED_WITH

PHP

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    //is ajax
}

답변

이 코드는 파일 입력에서도 작동합니다

$(document).on("submit", "form", function(event)
{
    event.preventDefault();
    $.ajax({
        url: $(this).attr("action"),
        type: $(this).attr("method"),
        dataType: "JSON",
        data: new FormData(this),
        processData: false,
        contentType: false,
        success: function (data, status)
        {

        },
        error: function (xhr, desc, err)
        {


        }
    });
});