I have a form with an onsubmit attribute. I need to bind a new submit event and I need this one to be executed before any existing submit functions.
The following code demonstrates the problem.
<!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>
If you execute the script, first you get “Second”, then “First”.
Is is possible to bind a new submit event and specify whether the function must be called before any existing event?
Constraints:
- Existing events must be preserved.
- I can’t remove existing events because the content of the
onsubmitattribute contains a quite complex logic written by Rails - (ADDED): the event should always be executed before any existing onsubmit event and already binded events (perhaps binded by an other plugin)
Any idea?
The inline submit event fires first, you could get a reference to it, nullify the
onsubmitattribute on theformelement, and then bind your new submit event, this one will execute your old submit handler:Note that I use the
callmethod to invoke your old submit handler, this is to preserve thethiskeyword inside that function, it will be theformelement itself.If your original
onsubmithandler has some validation behavior, you can get its return value byvar ret = oldSubmit.call(this);Check the above example here.