I just solve my question with event wrapper by using the following code. It's quite long code. But it works well on my basic testing. I can assign prepare submit event for watermark extender, before submit event for control validator, submit event for sending form data via AJAX and after submit event for form posting indicator.
/* jQuery - Form Submit Event Extender */
var _prepareSubmitFunction = new Object();
var _beforeSubmitFunction = new Object();
var _submitFunction = new Object();
var _afterSubmitFunction = new Object();
jQuery.fn._oldSubmit = jQuery.fn.submit;
function formSubmitEventExtender_Init(form)
{
form = $(form);
form.unbind('submit.formSubmitEventExtender');
form.bind('submit.formSubmitEventExtender', null, function ()
{
form.prepareSubmit();
if (form.beforeSubmit())
{
var result = true;
for (var i in _submitFunction[form.attr('id')])
{
var temp = _submitFunction[form.attr('id')][i]();
temp = ((temp === false) ? false : true);
result = result && temp;
}
form.afterSubmit();
return result;
}
else
{
return false;
}
});
}
jQuery.fn.prepareSubmit = function (fn)
{
var x = $(this);
x.ensureHasId();
var id = x.attr('id');
if (fn)
{
if (!_prepareSubmitFunction[id])
{
_prepareSubmitFunction[id] = new Array();
formSubmitEventExtender_Init(x);
}
if ($.inArray(fn, _prepareSubmitFunction[id]) < 0)
_prepareSubmitFunction[id].push(fn);
}
else
{
for (var i in _prepareSubmitFunction[id])
{
_prepareSubmitFunction[id][i]();
}
}
return x;
};
jQuery.fn.beforeSubmit = function (fn)
{
var x = $(this);
x.ensureHasId();
var id = x.attr('id');
if (fn)
{
if (!_beforeSubmitFunction[id])
{
_beforeSubmitFunction[id] = new Array();
formSubmitEventExtender_Init(x);
}
if ($.inArray(fn, _beforeSubmitFunction[id]) < 0)
_beforeSubmitFunction[id].push(fn);
}
else
{
for (var i in _beforeSubmitFunction[id])
{
if (!_beforeSubmitFunction[id][i]())
return false;
}
return true;
}
return x;
};
jQuery.fn.submit = function (fn)
{
var x = $(this);
x.ensureHasId();
var id = x.attr('id');
if (fn)
{
if (!_submitFunction[id])
{
_submitFunction[id] = new Array();
formSubmitEventExtender_Init(x);
}
if ($.inArray(fn, _submitFunction[id]) < 0)
_submitFunction[id].push(fn);
}
else
{
x._oldSubmit();
}
return x;
};
jQuery.fn.afterSubmit = function (fn)
{
var x = $(this);
x.ensureHasId();
var id = x.attr('id');
if (fn)
{
if (!_afterSubmitFunction[id])
{
_afterSubmitFunction[id] = new Array();
formSubmitEventExtender_Init(x);
}
if ($.inArray(fn, _afterSubmitFunction[id]) < 0)
_afterSubmitFunction[id].push(fn);
}
else
{
for (var i in _afterSubmitFunction[id])
{
_afterSubmitFunction[id][i]();
}
}
return x;
};