我有一个onsubmit
属性的表单。我需要绑定一个新的提交事件,我需要在任何现有的提交函数之前执行这个事件。
以下代码演示了此问题。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Test</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript">
jQuery(function($) {
// a plugin
$('form').submit(function() {
alert("Second");
});
// an other plugin
$('form').submit(function() {
alert("Third");
});
// this event must always be executed as first event
$('form').submit(function() {
alert("Always First");
});
});
</script>
</head>
<body>
<form onsubmit="javascript:alert('Fourth');">
<p>
<input type="submit">
</p>
</form>
</body>
</html>
如果您执行脚本,首先获得“Second”,然后是“First”。
是否可以绑定新的提交事件并指定是否必须在任何现有事件之前调用该函数?
约束:
onsubmit
属性的内容包含由Rails编写的非常复杂的逻辑有什么想法吗?
答案 0 :(得分:14)
首先触发内联提交事件,您可以获取对它的引用,使onsubmit
元素上的form
属性无效,然后绑定新的提交事件,此事件将执行您的旧提交处理程序:
jQuery(function($) {
var form = $('form'), oldSubmit = form[0].onsubmit;
form[0].onsubmit = null;
$('form').submit(function() {
alert("First");
oldSubmit.call(this); // preserve the context
});
});
请注意,我使用call
方法来调用旧的提交处理程序,这是为了保留该函数内的this
关键字,它本身就是form
元素。
如果您的原始onsubmit
处理程序具有某些验证行为,则可以通过var ret = oldSubmit.call(this);
检查上面的示例here。
答案 1 :(得分:3)
使用现有的submit
处理程序并将其存储在变量中。
然后在新的处理程序中,调用从前一个submit
处理程序存储的函数,并将新的函数重新分配给侦听器。
示例:
jQuery(function($) {
$('form').submit(function() {
var first = this.onsubmit;
//...
first.call( this );
});
});
......或类似的东西。 :=)
答案 2 :(得分:0)
我认为this是一种更好的方法,如果它能够正常运作,因为OP接受了它。