Надішліть форму за допомогою jQuery [закрито]


476

Я хочу надіслати форму за допомогою jQuery. Чи може хтось надати код, демонстраційну версію чи приклад посилання?

Відповіді:


482

Це залежить від того, ви надсилаєте форму звичайно або через дзвінок AJAX. Ви можете знайти багато інформації на jquery.com , включаючи документацію з прикладами. Для надсилання форми зазвичай перегляньте submit()метод на цьому веб-сайті. Для AJAX існує багато різних можливостей, хоча, ймовірно, ви хочете використовувати ajax()або post()методи, або методи. Зауважте, що post()це дійсно просто зручний спосіб викликати ajax()метод за допомогою спрощеного та обмеженого інтерфейсу.

Критичний ресурс, який я використовую щодня, і який ви маєте закладку, - це як працює jQuery . У ньому є навчальні посібники щодо використання jQuery, а ліва навігація дає доступ до всієї документації.

Приклади:

Нормальний

$('form#myForm').submit();

AJAX

$('input#submitButton').click( function() {
    $.post( 'some-url', $('form#myForm').serialize(), function(data) {
         // ... do something with response from server
       },
       'json' // I expect a JSON response
    );
});

$('input#submitButton').click( function() {
    $.ajax({
        url: 'some-url',
        type: 'post',
        dataType: 'json',
        data: $('form#myForm').serialize(),
        success: function(data) {
                   // ... do something with the data...
                 }
    });
});

Зауважимо, що вищезазначені ajax()та post()методи еквівалентні. Є додаткові параметри, які ви можете додати до ajax()запиту для обробки помилок тощо.


3
Я пропустив метод серіалізації. Очевидно, я подивився на jQuery.com, але їхні документи $.postявно деконструюють та реконструюють форму для створення даних для надсилання. Дякую!
номен.

1
якщо у мене є якісь дані, які я хочу додати до запиту на пошту (не ajax, форма надіслати запит на повідомлення) перед надсиланням, як це зробити?
ア レ ッ ク ス

1
@AlexanderSupertramp - у наведеному вище прикладі дані надсилаються як параметри форми, кодовані URL-адресою. Ви можете просто додати дані як додаткові параметри форми. $('form#MyForm').serialize() + '&newData=' + newData + '&moreData=' + moreData. Примітка: останні два, можливо, потрібно буде зашифрувати за допомогою URL-адреси encodeURIComponent(). АБО - ви можете змінити використання кодування JSON з обох кінців, але тоді вам потрібно буде ввести дані форми в структуру даних JavaScript з додатковими даними та серіалізувати їх. У такому випадку ви, мабуть, скористаєтеся serializeArrayформою та
з’єднайте

"Я очікую, що відповідь json" вирішила для мене іншу проблему (re: дзвінки на Flask вийшли з ладу).
scharfmn

Якщо у вас є кнопка для надсилання під назвою "подати", це або спокійно вийде з ладу (jQuery), або призведе до помилки, сказавши "подати не функція" (vanilla js). Кнопка перейменування будь-чого іншого вирішиться . ¯_ (ツ) _ / ¯ 🤷
fzzylogic

122

Вам доведеться користуватися $("#formId").submit().

Ви, як правило, називаєте це всередині функції.

Наприклад:

<input type='button' value='Submit form' onClick='submitDetailsForm()' />

<script language="javascript" type="text/javascript">
    function submitDetailsForm() {
       $("#formId").submit();
    }
</script>

Ви можете отримати більше інформації про це на веб-сайті Jquery .


55
Якщо ви використовуєте jQuery, чому б ви використовували вбудований атрибут onclick?
nnnnnn

3
@BradleyFlood - Як він повинен це зробити замість цього? Новачки, як ми хотіли б знати?
MarcoZen

2
@MarcoZen Я думаю, що BradleyFlood вказував, що фраза "Наприклад:" означає, що використання атрибута onclick inline - це лише один із кількох можливих способів. Дійсно, більше jQuery-подібних буде використовувати .on ('клік', submitDetailsForm).
Ян Кукацька

@JanKukacka - Помічено. Дякую.
MarcoZen

71

коли у вас є існуюча форма, вона тепер повинна працювати з jquery - ajax / post, ви можете:

  • повісьте на подання - подію вашої форми
  • запобігти функціональності надсилання за замовчуванням
  • робити свої речі

    $(function() {
        //hang on event of form with id=myform
        $("#myform").submit(function(e) {
    
            //prevent Default functionality
            e.preventDefault();
    
            //get the action-url of the form
            var actionurl = e.currentTarget.action;
    
            //do your own request an handle the results
            $.ajax({
                    url: actionurl,
                    type: 'post',
                    dataType: 'application/json',
                    data: $("#myform").serialize(),
                    success: function(data) {
                        ... do something with the data...
                    }
            });
    
        });
    
    });

Зауважте, що для того, щоб serialize()функція працювала у наведеному вище прикладі, всі елементи форми повинні мати свій nameатрибут.

Приклад форми:

<form id="myform" method="post" action="http://example.com/do_recieve_request">

<input type="text" size="20" value="default value" name="my_input_field">
..
.
</form>

@PtF - дані подаються за допомогою POST у цьому зразку, тому це означає, що ви можете отримати доступ до своїх даних через

 $_POST['dataproperty1'] 

, де dataproperty1 - це "ім'я змінної" у вашому json.

тут зразок синтаксису, якщо ви використовуєте CodeIgniter:

 $pdata = $this->input->post();
 $prop1 = $pdata['prop1'];
 $prop1 = $pdata['prop2'];

Чому ви повторно використовуєте селектор форми, чому не повторно використовуєте сам елемент форми?
Слава Фомін II

так, ви можете зробити так само: <form id = "myform" onsubmit = "do_stuff ()">, але якщо js буде завантажено пізніше / захищено, ця функція може бути недоступною .. тому я подумав ініціалізувати це в документі. готовий .... я не впевнений, якщо я на одній думці, чи можете ви проілюструвати, що ви куди?
вінок

1
Дякуємо, що підкреслили, що атрибут "name" має бути визначений
ccalboni

1
Тип даних: "application / json" - це помилка. Слід прочитати dataType: 'json'. Ви отримаєте помилки розбору, якщо їх залишити, як у наведеному вище прикладі.
Хенкстер

@Hankster так, був json, але його відредагували ... Холандер, ви можете перевірити / підтвердити?
утро

68

У jQuery я віддаю перевагу наступному:

$("#form-id").submit()

Але знову ж таки, вам дійсно не потрібен jQuery для виконання цього завдання - просто використовуйте звичайний JavaScript:

document.getElementById("form-id").submit()

1
@windmaomao Ви включили jQuery на свою веб-сторінку? Можливо, вам потрібно використовувати jQuery istead $ aswell - я рекомендую використовувати звичайне рішення JS, якщо ви вже не включили jQuery.
gernberg

1
@windmaomao У мене була така ж проблема. Мій jQuery виконував усі інші функції, але не надсилав форму. Він працював лише за допомогою методу document.getElementById.
ChallengeAcceppted

41

З посібника: jQuery Doc

$("form:first").submit();

3
Потрібно подати форму за допомогою "id", ніж знайти першу форму та подати її. Однак вона буде відмінно працювати, якщо є лише одна форма за один раз.
Chintan Thummar

22

Для інформації,
якщо хтось використовує

$('#formId').submit();

Не роби щось подібне

<button name = "submit">

Минуло багато годин, щоб знайти, що подати () не працюватиме так.


1
Друкарське слово на ключовому слові "sumit"робить незрозумілим, чи друкарська помилка у відповіді чи була пов’язана з проблемою. Ви маєте на увазі, що кнопка з назвою "submit"псує форму jquery submit ()? Або ви хочете сказати, що проблема полягає в тому, що ви дали ім'я кнопки подати замість стандартного type="submit"?
Дарин

мій намір був не відповідати на це питання, а розповісти тим, хто стикався з цією проблемою. Я думаю, що проблема полягає у назві кнопки без визначеного типу, тому що я використовував onclick event, щоб перевірити деякий вхід перед надсиланням. Якщо тип = відправити, тоді форму надсилайте без мого запуску події onclick.
AZ Soft

16

Використовуйте його, щоб подати форму за допомогою jquery. Ось посилання http://api.jquery.com/submit/

<form id="form" method="post" action="#">
    <input type="text" id="input">
    <input type="button" id="button" value="Submit">
</form>

<script type="text/javascript">
$(document).ready(function () {
    $( "#button" ).click(function() {
        $( "#form" ).submit();
    });
});
</script>

2
Хоча це давня публікація, варто додати тип buttonдо кнопки, щоб переконатися, що форма не надсилається (оскільки не всі браузери однаково ставляться до кнопок без типів).
Майкі

@Mikey Дякую за пропозицію.
Chintan Thummar

14

це надішле форму з попереднім завантажувачем:

var a=$('#yourform').serialize();
$.ajax({
    type:'post',
    url:'receiver url',
    data:a,
    beforeSend:function(){
        launchpreloader();
    },
    complete:function(){
        stopPreloader();
    },
    success:function(result){
         alert(result);
    }
});

Я маю якийсь трюк, щоб зробити публікацію даних форми реформованою випадковим методом http://www.jackart4.com/article.html


Ви можете опублікувати оновлене посилання? Посилання вище не працює.
Chris22


12

Зауважте, що якщо ви вже встановили слухач події подання для вашої форми, дзвінок інтернету для подання ()

jQuery('#<form-id>').submit( function(e){ 
    e.preventDefault();
    // maybe some validation in here
    if ( <form-is-valid> ) jQuery('#<form-id>').submit();
});

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

    jQuery('#<form-id>').submit( function(e){ 
      e.preventDefault();
      // note the [0] array access:
      if ( <form-is-valid> ) jQuery('#<form-id>')[0].submit();
    });


7
jQuery("a[id=atag]").click( function(){

    jQuery('#form-id').submit();      

            **OR**

    jQuery(this).parents("#form-id").submit();
});

7

Зауважте, що в Internet Explorer є проблеми з динамічно створеними формами. Форма, створена таким чином, не надсилатиметься в IE (9):

var form = $('<form method="post" action="/test/Delete/">' +
             '<input type="hidden" name="id" value="' + myid + '"></form>');
$(form).submit();

Щоб змусити його працювати в IE, створіть елемент форми та приєднайте його перед поданням так:

var form = document.createElement("form");
$(form).attr("action", "/test/Delete")
       .attr("method", "post");
$(form).html('<input type="hidden" name="id" value="' + myid + '" />');
document.body.appendChild(form);
$(form).submit();
document.body.removeChild(form);

Створення форми, як у прикладі 1, а потім її прикріплення не вийде - в IE9 вона видає помилку JScript DOM Exception: HIERARCHY_REQUEST_ERR (3)

Реквізити Tommy W @ https://stackoverflow.com/a/6694054/694325


7

Поки що рішення вимагають, щоб ви знали ідентифікатор форми.

Використовуйте цей код, щоб подати форму, не знаючи ідентифікатора:

function handleForm(field) {
    $(field).closest("form").submit();
}

Наприклад, якщо ви хочете обробити подію натискання кнопки, ви можете скористатися нею

$("#buttonID").click(function() {
    handleForm(this);    
});

6

Якщо кнопка розташована між тегами форми, я віддаю перевагу цій версії:

$('.my-button').click(function (event) {
    var $target = $( event.target );
    $target.closest("form").submit();
});



3

Мій підхід трохи інший. Змініть кнопку на кнопку подання, а потім натисніть кнопку

$("#submit").click(function(event) {
$(this).attr('type','submit');
$(this).click();
});

2
function  form_submit(form_id,filename){
    $.post(filename,$("#"+form_id).serialize(), function(data){
        alert(data);
    });
}

Він опублікує дані форми на вказане ім’я файлу через AJAX.


1

Я рекомендую загальне рішення, тому вам не доведеться додавати код для кожної форми. Скористайтесь плагіном форми jquery (http://jquery.malsup.com/form/) та додайте цей код.

$(function(){
$('form.ajax_submit').submit(function() {
    $(this).ajaxSubmit();
            //validation and other stuff
        return false; 
});

});


-2

Я також використовував наступне, щоб подати форму (не фактично надсилаючи її) через Ajax:

  jQuery.get("process_form.php"+$("#form_id").serialize(), {}, 
    function() {
      alert("Okay!"); 
    });

3
це не що-небудь схоже на submit (). для однієї речі submit () використовує семантику POST, ви використовуєте GET
Скотт Еверден
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.