2016-03-23 1 views
1

У меня есть простая функция JS, которая обновляет скрытое текстовое поле на основе 2 входных значений.parseInt (x, 10), вызывающий максимальный вызов/слишком большая ошибка рекурсии

Перед тем, как обновить скрытое текстовое поле, я использую ParseInt (х, 10), чтобы подтвердить, что ввод числовой, если не я устанавливаю значение 0.

Почему это вызывает слишком много рекурсии ошибка?

$(function() { 
     $("#payment-form").on("submit",function (e) { 

      var xDollars = $("#dollars").val(); 
      var xCents = $("#cents").val(); 
      //collect our form dollar and cents values, set to 0 if not int 
      if (parseInt(xDollars, 10) == "NaN") { 
       $("#dollars").val("0"); 
      } 
      if (parseInt(xCents, 10) == "NaN") { 
       $("#cents").val("00"); 
      } 

      //join dollars and cents and submit transaction amount 
      $("#TransactionAmount").val(xDollars + "." + xCents); 
      $("#payment-form").submit(); 
      return true; 
     }); 
    }); 
+2

Ваша ошибка не имеет ничего общего с 'parseInt()', потому что вы поднимаете событие, которое вы захватываете в обработчике событий, по какой-то нечетной причине. Почему вы снова вызываете 'submit()'? –

+0

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

+0

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

ответ

7

Это не parseInt(), что вызывает проблему, то это:

 $("#payment-form").submit(); 

Вы запуская «представить» действие изнутри «Submit» обработчика.

Если вы только что вернули true, если проверка прошла успешно, форма должна быть отправлена ​​нормально.

+0

omg, я полностью забыл об этом. Спасибо. – Mark

2

Это связано с тем, что jQuery не различает вопрос о том, отправляете ли вы форму через событие submit или по методу .submit(). Поэтому, если вы используете jQuery's $.submit(), он будет запускать событие submit вручную.

Используйте вместо ванили-js. Согласно Form submission algorithm, что событие не будет срабатывать, если вы используете .submit():

Если представлен от submit() метода флаг не установлен, то fire a simple event, что пузырьки и отменяемый имени submit, в форме. Если действие события по умолчанию предотвращено (то есть , если событие отменено), то отмените эти шаги. В противном случае продолжите (фактически, действие по умолчанию - выполнение представления).

Таким образом, это не было бы проблематично:

document.getElementById('payment-form').submit(); 

Но в этом случае вы можете просто удалить $("#payment-form").submit();. Если вы не отмените мероприятие, форма должна быть отправлена ​​автоматически.

Смежные вопросы