Предотвратить отправку формы после нажатия кнопки отправки с помощью кнопки отмены

У меня есть форма, которая представляет значения для back-end, но я хочу иметь кнопку отмены, которая останавливает отправку формы.

<form action="upload.php" method="post" enctype="multipart/form-data" id="UploadForm">
/*
*
parameters
*
*/
<button type="submit" value="submit" id="SubmitButton">Submit</button>
<button type="button" value="cancel" id="CancelButton">Cancel</button>
</form>

Кто-нибудь может рассказать, как это можно сделать?

Ответ 1

Решение, которое может работать:

var cancelObject = '';

$('#UploadForm').on('submit', function(e){

   //prevent default submit
   e.preventDefault();

   //submit via ajax
   cancelObject = $.post('upload.php', $( "#UploadForm" ).serialize());

});

$('#cancel_button').click(function(){

   //Cancel the request
   cancelObject.abort();

});

UNTESTET! - Только идея, которая могла бы работать.

Ответ 2

Попробуйте что-нибудь подобное. Вот ваш HTML:

<form action="upload.php" method="post" enctype="multipart/form-data" id="UploadForm">
  <button type="submit" value="submit" id="SubmitButton">Submit</button>
  <button type="button" id="CancelButton" disabled>Cancel</button>
</form>

Здесь ваш jQuery и JavaScript:

$(function() {
  var $form = $('#UploadForm');
  var form = $form.get(0);
  var $submit = $('#SubmitButton');
  var $cancel = $('#CancelButton');
  var xhr = null;

  function cleanup() {
    xhr = null;
    $submit.removeAttr('disabled');
    $cancel.attr('disabled', true);
  }

  function doneCallback() {
    // your code for completed form submission goes here
    // redirect the page or whatever you need to do
    cleanup();
  }

  $cancel.on('click', function() {
    if($cancel.attr('disabled')) {
      return;
    }

    if(xhr instanceof XMLHttpRequest) {
      xhr.abort();
    }

    cleanup();
  })

  $form.on('submit', function(event) {
    event.preventDefault();

    xhr = new XMLHttpRequest();
    xhr.open($form.attr('method'), $form.attr('action'), true);
    xhr.addEventListener('load', doneCallback);

    $submit.attr('disabled', true);
    $cancel.removeAttr('disabled');

    xhr.send(new FormData(form));

    return false;
  });
});

Здесь используется API FormData, поэтому проверьте поддержку браузера для что.

Ответ 3

Это не так просто, как просто прервать отправку. Как только эта кнопка нажата, нет никакого практического способа узнать, сколько, если есть, ее данных было отправлено еще.

Веб-браузер и веб-сервер не поддерживают связь между запросами, и поэтому остановка клиентской стороны script не означает, что она останавливает ее на стороне сервера.

Чтобы прервать эту отправку, вам необходимо отправить второй запрос серверу, сообщая об этом, а затем на сервере он может быть уже сохранен, поэтому потребуется удаление, и если это так, вам понадобится уникальный идентификатор оба идентифицируют запрос submit и его прерывания, так как они прибудут на серверную сторону как 2 уникальных запроса.

На сервере установка некоторых правил того, что и сколько данных требуется для фактического сохранения в db, может быть выполнено, тем не менее, что, если один пользователь имеет только 1 изображение, а второй - 3, как узнать, когда это Предполагается, что это "прерванная подача" или нет, основанная на таких правилах?

Задержка времени перед сохранением может быть чем-то другим, когда может быть принято прерывание, но опять же очень сложно сделать отказоустойчивость и в любом случае понадобится уникальный идентификатор для идентификации запросов.

Я думаю, ваш лучший выбор - сохранить его, поскольку я хотел бы верить, что большинство пользователей этого хотят, и если второй запрос приходит в течение определенного периода времени, он позволяет удалить.

Примите и используйте ответ Патрика Робертса, поскольку начало было бы хорошей идеей.

В этих двух похожих сообщениях вы можете найти дополнительную помощь.

Ответ 4

Добавить атрибут onsubmit к тегу кнопки: <button type="submit" value="submit" id="SubmitButton" onsubmit="return cancel()"> SubmitIt </button>

Javascript:
function cancel()
{
    var decision=null;

     alert("Press Y to submit or N to cancel");
      decision=prompt("Do you want to submit?","Y or N");
      if( decision.equals("Y"))
{
      return true;
      alert("Form has been submitted");

} 
     else if (decision.equals("N"))
{
    return false;
    alert("Form submission has been cancelled");

}
     else
{
    alert("wrong input.Re-submit the form.");
     return false;

}

}

Форма будет отправлена, если возвращаемое значение true. Функция js запрашивает у пользователя, хочет ли он продолжить и отправить или отменить действие.

Ответ 5

Хм, разве это не сработает для вас?

form (...) onsubmit="return false;"

Вместо "return false" вы можете использовать любую функцию JS, которую вы хотите. Обычно для этого используется проверка формы.