2016-09-30 6 views
0

Перед отправкой формы, я пытаюсь отключить все элементы, которые имеют стиль display:none.JQuery submit - бесконечный цикл

Если есть e.preventDefault(), форма не отправляется вообще, и если нет e.preventDefault(), то возникает бесконечный цикл.

$(document).on('submit', 'form', function (e) { 
    e.preventDefault(); 
    console.log($(':input:hidden').length); 
    $('#reservation-form > :input:hidden').attr("disabled", true); 
    $('#reservation-form').unbind('submit').submit(); 

}); 

Вы знаете, что нужно сделать, чтобы сделать все display:none поля отключены перед отправкой этой формы?

+1

Ваша проблема заключается в том, что событие не связано с '# backup-form', поскольку вы делегировали его в' document' –

+0

. Я думаю, это потому, что ваш слушатель находится на '$ (document)', а не на ' # резервирование form'. –

+0

Чтобы упредить, что может быть потенциально вашей следующей проблемой: * отключенные элементы не включены в формы отправляет *. (может быть, это то, что вы хотите). –

ответ

2

Вам не нужно запускать $('#reservation-form').unbind('submit').submit();

Снимите e.preventDefault(); вызов и возвращает истину в конце функции:

$(document).on('submit', 'form', function (e) { 
    console.log($(':input:hidden').length); 
    $('#reservation-form > :input:hidden').attr("disabled", true); 
    return true; 
}); 

Это должно дать вам поведение, которое вы хотите, без необходимости связывать и развязывать события.

+0

Подождите, это имеет смысл! ... Но выражение 'return true;' здесь бесполезно –

+0

Мне нравится добавлять его, насколько я помню, возврат false приведет к тому, что ваша форма не будет отправлена, поэтому я скорее верну свое истинное значение. –

+0

Просто протестируйте его, чтобы убедиться, и возвращение false предотвращает отправку вашей формы (очень полезно при выполнении проверок перед отправкой). –

2

Вы являетесь обязательным событием для уровня document, поэтому, чтобы развязать submit, вы должны отпереть его на уровне document.

Вот сказал, самый простой способ вместо того, чтобы назвать DOM родной submit() событие:

$('#reservation-form')[0].submit(); 

Кстати, для булева атрибута, лучше использовать .prop() даже если в вашем случае, это ничего не изменит:

$('#reservation-form > :input:hidden').prop("disabled", true); 
+0

Теперь он подает, но я боюсь, что это не сработает. Даже там есть поддержка, поля, которые в настоящее время отображаются: ни один стиль не отправляется. Я хочу, чтобы все элементы с дисплеем: ни один стиль не отправлялся или, по крайней мере, был пустым. –

+0

Возможно, вам следует использовать как селектор: '$ ('# backup-form: input: hidden')' –

0

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

$('input[type=hidden]') 

Документация: Css Selectors

+0

': hidden' - это селектор jQuery: https://api.jquery.com/hidden-selector/ –

+0

oh my плохо, я использовал только стандартные селектора css, спасибо за указание, должен ли я удалить ответ? – SuigetsuSake

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