2016-09-30 76 views
0

我试图在提交表单前禁用所有具有样式display:none的元素。JQuery提交 - 无限循环

如果有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

你的问题是,事件没有绑定到'#reservation-form',因为你已经将它委托给'document' –

+0

我认为这是因为你的监听器位于'$(document)'而不是' #预约form'。 –

+0

预先捕获您的下一个问题的可能性:*禁用的元素不包含在表单提交*中。 (可以这就是你想要的)。 –

回答

2

你不必跑$('#reservation-form').unbind('submit').submit();

取出e.preventDefault();呼叫,并在函数结束时返回true:

$(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将阻止表单提交,所以我宁愿明确地返回true。 –

+0

刚刚测试过,确认并返回false可以防止表单提交(在提交前进行验证时非常有用) –

2

要绑定事件document水平,因此取消绑定submit,你应该在document水平拆散它。

这是说,最简单的方法是改为调用DOM本地submit()事件:

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

顺便说一句,对于布尔属性,更好的方法是使用.prop()即使在你的情况下,改变什么:

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

现在提交,但恐怕这是行不通的。即使有道具,目前显示的字段:无风格。我希望所有具有display:none样式的元素都不要发送或至少为空。 –

+0

也许你应该使用选择器:'$('#reservation-form:input:hidden')' –

0

您正在使用错误的选择器来隐藏输入类型的元素。 您应该使用:

$('input[type=hidden]') 

文档:Css Selectors

+0

':hidden'是一个jQuery选择器:https://api.jquery.com/hidden-selector/ –

+0

哦我的不好,我只使用标准的CSS选择器,谢谢指出,我应该删除答案? – SuigetsuSake