【发布时间】:2012-12-20 06:38:34
【问题描述】:
我有几个类似这样的表格:
<form id=myForm onsubmit="saveFormData(this);return false">
....
</form>
提交后,执行自定义函数,并取消默认操作(通过http发送数据)。
但现在我需要验证表单,如果验证正常,则触发自定义函数(在这种情况下为saveFormData,但其他表单可能不同),否则什么也不做。
所以最终的事件处理程序应该像这样工作:
$('#myForm').submit(function(){
if(formValidatesOk(this))
saveFormData() ;
return false ;
}
但是,我无法更改 HTML 代码,因此我需要一种通用的方法来重新定义 onsubmit 事件,方法是使用 jquery 事件处理程序包装硬编码的处理程序。
我首先想到的是(未经测试):
var hardcodedHandler = $('#myForm').prop('onsubmit') ; // save the current handler
$('#myForm').prop('onsubmit',null) ; // remove the current handler
$('#myForm').submit(function(){
if(formValidatesOk(this)) // if the form is valid then...
Function(hardcodedHandler).call(this) ; // trigger the original handler
return false ;
}) ;
但这不是很优雅(至少可以这么说)。
你知道更好的方法吗?
【问题讨论】:
-
formValidatesOk有什么异步的吗?如果不是,当formValidatesOk的结果是false时,你为什么不onlyreturn false;?因此逻辑将是“如果 formValidatesOk 返回 true,则还执行原始onsubmit...否则,停止默认行为(返回 false)”。这将是if (!formValidatesOk(this)) return false;,就是这样。或者您是说您不希望默认行为发生? -
我不想通过 http 提交表单。但我确实希望在表单验证正常时触发硬编码处理程序(示例中为
saveFormData)。 -
@Ian,我如何确定 jquery 处理程序会在硬编码处理程序之前触发?
-
啊,我明白了,我没有想到这一点。这就是为什么我想把它说出来:) 我会看看 Bergi 的回答......没想到
prop会不同于attr并得到你真正想要的
标签: javascript jquery html forms validation