Javascript 围绕硬编码处理程序包装jquery事件处理程序

Javascript 围绕硬编码处理程序包装jquery事件处理程序,javascript,jquery,html,forms,validation,Javascript,Jquery,Html,Forms,Validation,我有以下几种形式: <form id=myForm onsubmit="saveFormData(this);return false"> .... </form> $('#myForm').submit(function(){ if(formValidatesOk(this)) saveFormData() ; return false ; } 但是,我无法对HTML代码进行更改,因此我需要一种通用方法,通过使用jquery事件处理程

我有以下几种形式:

<form id=myForm onsubmit="saveFormData(this);return false">
....
</form>
$('#myForm').submit(function(){
    if(formValidatesOk(this))
        saveFormData() ;
    return false ;
}
但是,我无法对HTML代码进行更改,因此我需要一种通用方法,通过使用jquery事件处理程序包装硬编码处理程序来重新定义onsubmit事件

我想到的第一件事是(未经测试):

但这不是很优雅(至少可以说)


您知道更好的方法吗?

您可以从元素的
onsubmit
属性中获取旧函数,无需
求值它:

var form = $('#myForm');
var oldHandler = form.prop("onsubmit");
form.removeProp("onsubmit").submit(function(e){
    e.preventDefault();
    if(formValidatesOk(this))
        oldHandler.call(this, e);
});

事件是不可预测的(以被触发的方式)。我认为,受他们约束的投手也不能依赖秩序。因此,将处理程序绑定到更改先前添加的处理程序的事件肯定是(非常)糟糕的做法。事实上,正如您所建议的,您永远无法确定将首先触发哪个处理程序。毕竟,事件之间不应该互相通知。应该使用事件和处理程序来避免代码的高度耦合


解决这个问题的最佳方法(考虑到您的约束)是用新的行为修饰您的“旧”处理程序。Bergi给出了一个很好的例子。

formValidatesOk中有什么东西是异步的吗?如果不是,为什么不只
返回false
FormValidateOK
的结果为
false
时?因此,逻辑应该是“如果formValidatesOk返回true,也执行原始的
onsubmit
…否则,停止默认行为(返回false)”。如果(!FormValidateOK(this))返回false,则为
就是这样。或者你是说你不希望默认行为发生?我不希望表单通过http提交。但是我确实希望在表单验证ok时触发硬编码处理程序(
saveFormData
),伊恩,我如何确保jquery处理程序在硬编码处理程序之前被触发?啊,我明白了,我没有想到这一点。这就是我想说出来的原因:)我会看看Bergi的答案……没想到
prop
会与
attr
不同,并得到你真正想要的。我很确定事件总是按照它们绑定的顺序执行。当然,OP是另一种情况,因为有些是用jQuery绑定的,有些是内联的。但是在这种情况下,内联的应该首先执行,因为它们首先被绑定(只要元素被解析/呈现),Ian,谢谢你的评论!它应该是处理程序而不是事件,我将更新我的答案。事件是不可预测的事件,处理程序是向其注册的函数。尽管如此,我认为不应该以添加事件和处理程序的方式依赖它们的顺序。而且,处理者之间不应该互相通知。如果是这样,请将它们包装在一个处理程序中,以确保正确的顺序和正确的执行(检查依赖函数是否正确执行)。当然,jQuery实现将按照添加顺序执行它们,但这是“just”实现。
var form = $('#myForm');
var oldHandler = form.prop("onsubmit");
form.removeProp("onsubmit").submit(function(e){
    e.preventDefault();
    if(formValidatesOk(this))
        oldHandler.call(this, e);
});