Невозможно предотвратить форму при выполнении условия - PullRequest
0 голосов
/ 07 ноября 2018

Я работаю над формой, которую я хочу проверить через jQuery $ .ajax. Форма должна быть представлена ​​только при определенном условии, data == 1

var preventSubmit = function() {
  return false;
  var form = $(this),
    name = form.find('#name').val(),
    email = form.find('#email').val(),
    comment = form.find('#comment').val();

  $.ajax({
    type: "POST",
    url: absolute_store_link + '/ajax/comments-filter',
    data: {
      name: name,
      email: email,
      comment: comment
    },
    success: function(data) {
      // if data is equal to 1,
      // submit form
      if (data == 1) {
        return true;
      }
    }
  });

};

$("#comment_form").on('submit', preventSubmit);

Отправка происходит независимо от того, выполнено условие или нет.

Где моя ошибка?

Если я использую e.preventDefault();, как я могу "отменить" его, если данные равны , равному 1?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Что-либо после return false; никогда не будет выполнено.

Кроме того, вы должны выполнять проверку формы на внешнем интерфейсе, а не на внутреннем. С учетом вышесказанного вам не следует удалять проверку из серверной части.

Еще одна вещь, попробуйте сначала выполнить проверку формы HTML5 , поскольку это ваша первая линия защиты.

Вы смотрите на что-то вроде:

var validateForm = function(e) {
  // prevent the default form action to allow this code to run
  e.preventDefault();

  var isValid = false,
    form = $(this),
    name = form.find('#name').val(),
    email = form.find('#email').val(),
    comment = form.find('#comment').val();

  // Validation goes here
  // ...
  // isValid = true;

  if (isValid) {
    $.ajax({
      type: "POST",
      url: absolute_store_link + '/ajax/comments-filter',
      data: {
        name: name,
        email: email,
        comment: comment
      },
      success: function(data) {
        // do something with the response. Maybe show a message?
        form.submit();
      }
    });
  }
};
0 голосов
/ 07 ноября 2018

Вы не сможете разрешить отправку формы с возвращаемым значением true, потому что ajax происходит асинхронно (к тому времени, когда он завершает, функция уже закончила выполнение). Что вы можете сделать, так это всегда запретить отправку формы в функции preventSubmit, а затем отправить ее программно.

var preventSubmit = function() {
  
  var form = $(this),
    name = form.find('#name').val(),
    email = form.find('#email').val(),
    comment = form.find('#comment').val();

  $.ajax({
    type: "POST",
    url: absolute_store_link + '/ajax/comments-filter',
    data: {
      name: name,
      email: email,
      comment: comment
    },
    success: function(data) {
      // if data is equal to 1,
      // submit form
      if (data == 1) {
        form.off();//remove bound events (this function)
        form.submit();//manually submit the form
      }
    }
  });
  return false;//the return needs to be at the end of the function and will always prevent submission
};

$("#comment_form").on('submit', preventSubmit);
...