Як подати HTML-форму без переспрямування


95

Якщо у мене є така форма,

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

як я можу подати його без перенаправлення на інший вигляд за допомогою JavaScript / jQuery?

Я прочитав безліч відповідей із Stack Overflow, але всі вони переспрямовують мене на подання, повернене функцією POST.


Ви хочете отримати запит XHR (AJAX)
Стерлінг Арчер

2
XHR / AJAX - один із способів - він надсилає публікацію та отримує відповідь за кадром, тому браузер ніколи не залишає сторінку, на якій знаходиться. Інший спосіб - це перенаправлення на стороні сервера після обробки повідомлення, яке залежить від того, яку технологію сервера ви використовуєте.
Stephen P

@StephenP Я використовую ASP.NET MVC 5.1.
Duke Nuke

@Duke, все, що я кажу, полягає в тому, що існує більше одного підходу (ajax проти перенаправлення сервера), і ваш вибір залежить від ваших потреб. Сучасні сайти, швидше за все, захочуть робити ajax. Слід також зазначити , що всі ці відповіді говорять вам потрібно JQuery - JQuery здорово , але є це , по суті, інші способи зробити Аякса ... хоча я б на самому ділі використовувати JQuery сам.
Stephen P

1
Мій спосіб простий, чистий та елегантний, і це лише 2 рядки коду. Він не використовує сценарії та працює в HTML4 та новіших версіях, навіть якщо JavaScript вимкнено.
Ісса Чанзі,

Відповіді:


74

Для того, щоб досягти бажаного, вам потрібно використовувати 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

Це спрацювало:function SubForm (){ alert("1"); //e.preventDefault(); $.ajax({ url:'/Car/Edit/@Model.Id/', type:'post', data:$('#myForm').serialize(), success:function(){ alert("fasf"); } }); }
Duke Nuke

З якихось причин ваше друге рішення не спрацювало, але те, яке я опублікував в останньому коментарі, спрацювало. Я додаю своє рішення до вашої публікації, лише завдяки вам я міг цього досягти.
Duke Nuke

1
другий також повинен спрацювати, можливо, в ньому є щось інше, але якщо ви знайшли рішення, нам не потрібно йти цією дорогою прямо зараз! рада, що це допомогло;)
Амін Джафарі

Дякую, що ця відповідь також допомогла мені розмістити власний текст замість форми після подання
Анупам

116

Ви можете досягти цього, перенаправивши форми у actionневидимі <iframe>. Для цього не потрібні сценарії JavaScript або будь-який інший тип.

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

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

1
Це чудово. Але як я можу щось зробити після подання форми? тобто текстові поля форми повинні бути порожніми, фокус повертається до першого поля тощо?
Пранджал Холадхара,

1
Існує якийсь javascript, який може це зробити. Просто змініть <input type='submit'...на <input type='reset'і додайтеonclick='document.forms["myForm"].submit();'>
Ісса Чанзі

Прекрасна відповідь! Чудово працює
Кібр

Будьте обережні, ймовірно, сторінку, у якій знаходиться ваша форма, можна перезавантажити у iframe, що може спричинити проблеми з продуктивністю, якщо ви створюєте програму чи великий веб-сайт.
Олександр Дабрікур,

22

Помістіть приховане 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 все ще є необов’язковою.
Даніель Де Леон,

18

Оскільки всі поточні відповіді використовують jQuery або хитрощі з iframe, вирішив, що немає шкоди додавати метод із простим 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
Дуже дякую!
Джошуа Еванс,

Я даю вам капелюх. Я годинами намагався з’ясувати, як змусити jquery надіслати форму до серверної бази nginx із параметром contentType = false і завжди отримувати 415 в результаті. Це було єдине рішення, яке я знайшов, яке вирішило мою конкретну проблему.
user12066

7

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

Якщо ви не хочете, щоб його переспрямовували, просто не встановлюйте жодних дій і не встановлюйте onsubmit="someFunction();"

У ваших someFunction()ви робите все , що ви хочете (з AJAX чи ні) і в фіналі, ви додасте return false;повідомити браузеру не відправити форму ...


1
Існує магічний спосіб зробити це. Встановіть цільовий атрибут, щоб форма переспрямовувала кудись, крім поточного кадру. Якщо ви додасте невидимий iframe для подібних речей на своїх сторінках. Це досить просто.
Ісса Чанзі,

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
Чи є якась особлива причина, чому ви не робите відступ у цьому вихідному коді? Це схоже на код шістдесятих років до винайдення С. Я думав, що ми це вже давно закінчили.
Алфе

2

Див. postФункцію jQuery .

Я б створив кнопку, встановив onClickListener( $('#button').on('click', function(){});) і надіслав дані у функції.

Також див. preventDefaultФункцію jQuery!


2

Однострочнікі рішення в 2020 р, якщо дані не призначені для передачі в multipart/form-dataабо application/x-www-form-urlencoded:

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

3
Якщо ви поєднуєте це з операційними програмами action="...", це ефективно запобігає переходу між сторінками, а також запобігає передачі даних через мережу.
Кев

@Kev Я особисто надсилаю свої дані через JS XHR, саме тому я не хочу переспрямування сторінки, оскільки це додаток JS
Олександр Дабрікурт,

@Kev Вибачте, я повинен був згадати про це
Олександр Дабрікурт,

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.