jQuery AJAX надіслати форму


938

У мене форма з назвою orderproductFormта невизначеною кількістю входів.

Я хочу зробити якийсь jQuery.get або ajax або щось подібне, що викликало б сторінку через Ajax, і надсилати всі вхідні дані форми orderproductForm .

Я думаю, що одним із способів було б зробити щось на кшталт

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

Однак я не знаю точно всіх форм вводу. Чи є функція, функція чи щось таке, що просто надішле ВСІ введення форми?

Відповіді:


814

Ви можете використовувати функції ajaxForm / ajaxSubmit з плагіна Ajax Form або функції серіалізації jQuery.

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 тут .


2
Цікава ідея, однак я не контролюю серверну сторону, яку я дзвоню, тому не можу надсилати їй серіалізовані дані
Nathan H

25
Так, ви можете, ім'я не важливо, що воно буде робити, це надсилати пари кожного ключа-ключа та кожної змінної форми.

6
Він серіалізується в рядок запиту, як і дані, які ви вводите в масив вручну під час виклику GET. Це те, що ти хочеш, я майже впевнений.
JAL

1
oooh Я бачу, я потім додаю цей рядок до кінця URL-адреси у виклику get. Я думав, що PHP серіалізувати. Вибачте. Дякую!
Натан Н

238
.ajaxSubmit()/ .ajaxForm()не є основними функціями jQuery - вам потрібен плагін jQuery Form
Yarin

1399

Це проста довідка:

// 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.
           }
         });


});

Сподіваюся, це допоможе тобі.


46
Але form.serialize () не може розмістити <input type = "file"> в IE
macio.

2
Прекрасна відповідь за нормальне подання форми!
The Sheek Geek

1
Подібно до @ BjørnBørresen, ви також можете використовувати, type: $(this).attr('method')якщо ви використовуєте methodатрибут у вашій формі.
djule5

2
Можливо, варто згадати, що оскільки jQuery 1.8, .success, .error та .complete застаріли на користь .done, .fail та .always.
Адам

2
@ Коментар JohnKary - чудова стаття, схоже, вона більше не доступна. Ось архів подій jQuery: Стоп (Mis) Використання Return False
KyleMit

455

Ще одне подібне рішення з використанням атрибутів, визначених у елементі форми:

<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>

Будь-які пропозиції, як це зробити, якщо атрибут name містить "."? (Вимога на стороні сервера, не моя ідея).
Йозеф Енгельфрост

Додайте до цього зворотний виклик помилки, щоб завершити його. Ніколи не знає, коли ви отримаєте помилку, її завжди слід враховувати.
кодування

1
Якщо ви не встановите метод чи дію, вони за замовчуванням getвідповідають поточній URL-адресі відповідно. Можна було б додати це припущення до коду.
rybo111

1
За документацією jQuery ( api.jquery.com/submit ), frm.submit (функція (подія) {..}); еквівалентно frm.on ("подати", функція (подія) {..}) ;. Мені останнє легше читати, оскільки очевидно, що ви приєднуєте обробник подій до елемента, який повинен бути виконаний при запуску події.
mehmet

177

Є кілька речей, про які потрібно пам’ятати.

1. Існує кілька способів подати форму

  • за допомогою кнопки надсилання
  • натисканням клавіші Enter
  • запустивши подію надсилання в JavaScript
  • можливо більше, залежно від пристрою чи майбутнього пристрою.

Таким чином, ми повинні прив’язатись до події надсилання форми , а не до події натискання кнопки. Це забезпечить роботу нашого коду на всіх пристроях та допоміжних технологіях зараз та в майбутньому.

2. Хіджакс

У користувача може бути не ввімкнено JavaScript. Тут хороший шаблон хиджаксу , де ми обережно беремо контроль над формою за допомогою JavaScript, але залишаємо її поданою, якщо JavaScript не працює.

Ми повинні витягнути URL-адресу та метод із форми, тому якщо HTML зміниться, нам не потрібно оновлювати JavaScript.

3. Ненав'язливий JavaScript

Використання event.preventDefault () замість повернення false є хорошою практикою, оскільки це дозволяє події підніматися. Це дозволяє іншим сценаріям приєднуватися до події, наприклад, сценарії аналітики, які можуть контролювати взаємодію користувачів.

Швидкість

Ми в ідеалі повинні використовувати зовнішній скрипт, а не вставляти наш сценарій в рядок. Ми можемо зв’язати це в головному розділі сторінки, використовуючи тег скрипту, або зв’язавшись із ним у нижній частині сторінки для швидкості. Сценарій повинен спокійно покращити користувацький досвід, а не заважати.

Код

Якщо припустити, що ви згодні з усім вищесказаним, і ви хочете зловити подію подання та обробити це за допомогою AJAX (шаблон хиджаксу), ви можете зробити щось подібне:

$(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)

Додайте атрибут автовіддачі даних до тегу форми, і ви можете це зробити:

HTML

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

JS

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

2
як я можу додати зворотні дзвінки до функцій "зроблено" та "провалити"? щось на зразок $ ('form [data-autosubmit]'). autosubmit (). done (функція ({...}); це можливо?
Хрестоносець

1
Привіт @Crusader - безумовно, замість того, щоб цей плагін повертати це, ви могли б змусити його повернути події ajax, тоді ви могли б ланцюг прямо на нього. Крім того, ви можете отримати плагін, щоб отримати успішний зворотний дзвінок.
суперлюмінація

Я не бачу, як це відбувається ".. залишати його поданим, якщо JavaScript не вдається" відбувається тут?
mehmet

@mmatt - Якщо JavaScript відключений, форма все ще є лише формою. Користувач натискає кнопку "Надіслати" і відбувається регулярне надсилання форми на основі браузера. Ми називаємо це прогресивним вдосконаленням. Зараз це не так вже й багато, оскільки сучасні читачі екранів підтримують JavaScript.
суперлюмінація

@mmatt - Відкликані обіцянки виклику необов'язково отримають параметр, який містить дані.
суперлюмінація

41

Ви також можете використовувати 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 .


8
Я бачу, що FormData зараз підтримується IE10. Через кілька років це стане кращим рішенням.
надсвітні

3
Яка перевага цього способу?
вступ

1
Перевага @insign полягає в тому, що плагін не потрібен і працює у багатьох сучасних браузерах.
Хофі

4
@insign FormData також може обробляти файли (якщо у вашій формі є одне таке поле), тоді як serialize () просто ігнорує його.
mehmet

Uncaught TypeError: Не вдалося побудувати "FormData": параметр 1 не типу "HTMLFormElement"
rahim.nagori

28

Проста версія (не надсилає зображення)

<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
  • Ви можете запустити це до того, як документ буде готовий
  • Ви можете видалити та повторно додати форму, і вона все одно працюватиме
  • Він буде розміщений у тому самому місці, що і звичайна форма, вказана в атрибуті форми "дія"

JavaScript

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)
            }
        });
    }
});

Я хотів відредагувати відповідь Альфреквва, але занадто сильно відхилився від неї, тому вирішив опублікувати це як окрему відповідь.

Не надсилає файли, не підтримує кнопки, наприклад, натискання кнопки (включаючи кнопку подання) надсилає її значення у вигляді даних форми, але, оскільки це запит ajax, натискання кнопки не буде надіслане.

Для підтримки кнопок ви можете зафіксувати фактичне натискання кнопки замість надсилання.

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);
            }
        });
    }
});

На стороні сервера ви можете виявити запит ajax з цим заголовком, який встановлює jquery HTTP_X_REQUESTED_WITH для php

PHP

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

Як це буде працювати, якщо ви хочете надіслати файл із цією формою?
Ямі Медіна

1
@YamiMedina, це не просте рішення, вам потрібно надіслати весь запит в іншому форматі (формат багатопартійних) з даними файлу
Timo Huovinen

22

Цей код працює навіть при введенні файлів

$(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)
        {


        }
    });        
});

3
Просто зауважте, що formData () - це IE10 + developer.mozilla.org/en-US/docs/Web/API/FormData
Кріс Хопкінс

1
тип даних: "json" важливий, якщо ви хочете використовувати form.serialize ()
Девід Морроу,

ух, ця FormData чудова! на випадок, якщо комусь потрібно: Array.from(new FormData(form))повторює цей ітератор формату даних :)
test30

13

Мені дуже сподобався цей відповідь на superluminary і особливо те , як він загорнув це рішення в JQuery плагін. Тож спасибі суперлюмінації за дуже корисну відповідь. Однак у моєму випадку я хотів плагін, який дозволив би мені визначити обробники подій успіху та помилок за допомогою параметрів, коли плагін ініціалізований.

Отже ось що я придумав:

;(function(defaults, $, undefined) {
    var getSubmitHandler = function(onsubmit, success, error) {
        return function(event) {
            if (typeof onsubmit === 'function') {
                onsubmit.call(this, event);
            }
            var form = $(this);
            $.ajax({
                type: form.attr('method'),
                url: form.attr('action'),
                data: form.serialize()
            }).done(function() {
                if (typeof success === 'function') {
                    success.apply(this, arguments);
                }
            }).fail(function() {
                if (typeof error === 'function') {
                    error.apply(this, arguments);
                }
            });
            event.preventDefault();
        };
    };
    $.fn.extend({
        // Usage:
        // jQuery(selector).ajaxForm({ 
        //                              onsubmit:function() {},
        //                              success:function() {}, 
        //                              error: function() {} 
        //                           });
        ajaxForm : function(options) {
            options = $.extend({}, defaults, options);
            return $(this).each(function() {
                $(this).submit(getSubmitHandler(options['onsubmit'], options['success'], options['error']));
            });
        }
    });
})({}, jQuery);

Цей плагін дозволяє мені дуже легко «ajaxify» HTML форми на сторінці та забезпечити onsubmit , успіху і помилки обробників подій для здійснення зворотного зв'язку з користувачем статусу відправки форми. Це дозволило використовувати плагін наступним чином:

 $('form').ajaxForm({
      onsubmit: function(event) {
          // User submitted the form
      },
      success: function(data, textStatus, jqXHR) {
          // The form was successfully submitted
      },
      error: function(jqXHR, textStatus, errorThrown) {
          // The submit action failed
      }
 });

Зауважте, що обробники подій успіху та помилок отримують ті ж аргументи, що й ви отримали від відповідних подій методу jQuery ajax .


9

Я отримав для мене наступне:

formSubmit('#login-form', '/api/user/login', '/members/');

де

function formSubmit(form, url, target) {
    $(form).submit(function(event) {
        $.post(url, $(form).serialize())
            .done(function(res) {
                if (res.success) {
                    window.location = target;
                }
                else {
                    alert(res.error);
                }
            })
            .fail(function(res) {
                alert("Server Error: " + res.status + " " + res.statusText);

            })
        event.preventDefault();
    });
}

Це передбачає, що пост 'url' повертає аякс у вигляді {success: false, error:'my Error to display'}

Ви можете змінювати це як завгодно. Сміливо використовуйте цей фрагмент.


1
Для чого targetтут? Чому ви надсилаєте форму з AJAX, лише щоб перенаправити на нову сторінку?
1252748

9

jQuery AJAX форма подання , це не що інше, як надіслати форму, використовуючи ідентифікатор форми, коли ви натискаєте кнопку

Будь ласка, виконайте кроки

Крок 1 - Тег форми повинен мати поле для ідентифікації

<form method="post" class="form-horizontal" action="test/user/add" id="submitForm">
.....
</form>

Кнопка, яку ви збираєтесь натиснути

<button>Save</button>

Крок 2 - подія подання знаходиться в jQuery, що допомагає надіслати форму. В нижче код , який ми готуємо запит JSON з елемента HTML ім'я .

$("#submitForm").submit(function(e) {
    e.preventDefault();
    var frm = $("#submitForm");
    var data = {};
    $.each(this, function(i, v){
        var input = $(v);
        data[input.attr("name")] = input.val();
        delete data["undefined"];
    });
    $.ajax({
        contentType:"application/json; charset=utf-8",
        type:frm.attr("method"),
        url:frm.attr("action"),
        dataType:'json',
        data:JSON.stringify(data),
        success:function(data) {
            alert(data.message);
        }
    });
});

для демо-версії натисніть на посилання нижче

Як подати форму за допомогою jQuery AJAX?


5

розглянути можливість використання closest

$('table+table form').closest('tr').filter(':not(:last-child)').submit(function (ev, frm) {
        frm = $(ev.target).closest('form');
        $.ajax({
            type: frm.attr('method'),
            url: frm.attr('action'),
            data: frm.serialize(),
            success: function (data) {
                alert(data);
            }
        })
        ev.preventDefault();
    });

5

Я знаю, що це jQueryпов’язане питання, але зараз із JS ES6 все набагато простіше. Оскільки немає чистої javascriptвідповіді, я подумав, що можу додати просте чисте javascriptрішення до цього, яке, на мою думку, набагато чистіше, використовуючи fetch()API. Це сучасний спосіб реалізації мережевих запитів. У вашому випадку, оскільки у вас вже є елемент форми, ми можемо просто використовувати його для створення нашого запиту.

const form = document.forms["orderproductForm"];
const formInputs = form.getElementsByTagName("input"); 
let formData = new FormData(); 
for (let input of formInputs) {
    formData.append(input.name, input.value); 
}

fetch(form.action,
    {
        method: form.method,
        body: formData
    })
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.log(error.message))
    .finally(() => console.log("Done"));

4

Щоб уникнути отримання декількох форматних даних:

Не забудьте відмовитись від події надсилання, перш ніж форма знову буде надіслана, Користувач може викликати функцію sumbit не один раз, можливо, він щось забув, або була помилка перевірки.

 $("#idForm").unbind().submit( function(e) {
  ....

4

Якщо ви використовуєте form .serialize () - потрібно надати кожному елементу форми таке ім’я:

<input id="firstName" name="firstName" ...

І форма серіалізується так:

firstName=Chris&lastName=Halcrow ...

4

Ви можете скористатися цією функцією при поданні, як показано нижче.

Форма HTML

<form class="form" action="" method="post">
    <input type="text" name="name" id="name" >
    <textarea name="text" id="message" placeholder="Write something to us"> </textarea>
    <input type="button" onclick="return formSubmit();" value="Send">
</form>

jQuery функція:

<script>
    function formSubmit(){
        var name = document.getElementById("name").value;
        var message = document.getElementById("message").value;
        var dataString = 'name='+ name + '&message=' + message;
        jQuery.ajax({
            url: "submit.php",
            data: dataString,
            type: "POST",
            success: function(data){
                $("#myForm").html(data);
            },
            error: function (){}
        });
    return true;
    }
</script>

Більш детальну інформацію та зразок відвідайте: http://www.spiderscode.com/simple-ajax-contact-form/


2

Це не відповідь на питання ОП,
але у випадку, якщо ви не можете використовувати статичну форму DOM, ви також можете спробувати так.

var $form = $('<form/>').append(
    $('<input/>', {name: 'username'}).val('John Doe'),
    $('<input/>', {name: 'user_id'}).val('john.1234')
);

$.ajax({
    url: 'api/user/search',
    type: 'POST',
    contentType: 'application/x-www-form-urlencoded',
    data: $form.serialize(),
    success: function(data, textStatus, jqXHR) {
        console.info(data);
    },
    error: function(jqXHR, textStatus, errorThrown) {
        var errorMessage = jqXHR.responseText;
        if (errorMessage.length > 0) {
            alert(errorMessage);
        }
    }
});

2

Спробуйте

fetch(form.action,{method:'post', body: new FormData(form)});


1

Просто дружнє нагадування, яке також dataможе бути об’єктом:

$('form#foo').submit(function () {
    $.ajax({
        url: 'http://foo.bar/some-ajax-script',
        type: 'POST',
        dataType: 'json',
        data: {
            'foo': 'some-foo',
            'bar': 'some-bar'
        }
    }).always(function (data) {
        console.log(data);
    });

    return false;
});

1

JavaScript

(function ($) {
    var form= $('#add-form'),
      input = $('#exampleFormControlTextarea1');


   form.submit(function(event) {

       event.preventDefault(); 

       var req = $.ajax({
           url: form.attr('action'),
           type: 'POST',
           data: form.serialize()
       });
    req.done(function(data) {
       if (data === 'success') {
           var li = $('<li class="list-group-item">'+ input.val() +'</li>');
            li.hide()
                .appendTo('.list-group')
                .fadeIn();
            $('input[type="text"],textarea').val('');
        }
   });
});


}(jQuery));

HTML

    <ul class="list-group col-sm-6 float-left">
            <?php
            foreach ($data as $item) {
                echo '<li class="list-group-item">'.$item.'</li>';
            }
            ?>
        </ul>

        <form id="add-form" class="col-sm-6 float-right" action="_inc/add-new.php" method="post">
            <p class="form-group">
                <textarea class="form-control" name="message" id="exampleFormControlTextarea1" rows="3" placeholder="Is there something new?"></textarea>
            </p>
            <button type="submit" class="btn btn-danger">Add new item</button>
        </form>

-21

Існує також подія надсилання, яка може бути ініційована так, як ця $ ("# form_id"). Submit (). Ви використовуєте цей метод, якщо форма вже представлена ​​в HTML. Ви просто прочитали на сторінці, заповнили вклади форми записом, а потім зателефонуйте .submit (). Він використовуватиме метод та дії, визначені в декларації форми, тому вам не потрібно копіювати його у свій JavaScript.

приклади


58
якщо ви видалите свою публікацію, ви отримаєте штрафні бали, які вам забрали назад.
іскра-павук

2
Ця форма подасть форму, але не через AJAX, тому не відповідає на питання.
надсвітні

11
що @spider сказав, плюс ви отримаєте приємний знак під назвою "тиск однолітків"
Нуреттін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.