我想为 jQuery.post() 提供一些额外的功能。我希望能够检查来自服务器的响应并调用不同的回调。
例如:
$("#frmFoo").postForm("ajax")
.start(function () { showSpinner(); })
.success(function () { alert ("Foo saved"); })
.error(function() { alert ("Foo could not be saved at this time"); })
.validationError(function() { alert("Please fix foo and try again"); })
.complete(function() { hideSpinner(); });
因此,我希望能够将一致的 JSON 对象发送回页面,并基于该 JSON 对象调用成功或验证错误,为验证错误提供附加信息。
更新 这是一个陡峭的学习曲线,我几乎 100% 确定我做错了什么。下面是我对我想要的功能的尝试。
(function ($) {
$.fn.postForm = function (url) {
var options = options || {};
var formData = this.serialize();
var validationCb = jQuery.Callbacks("once memory");
var successCb = jQuery.Callbacks("once memory");
var errorCb = jQuery.Callbacks("once memory");
var completeCb = jQuery.Callbacks("once memory");
var s = jQuery.ajaxSetup({ }, options);
var callbackContext = s.context || s;
foo = {
success: function () {
successCb.add(arguments[0]);
return this;
},
complete: function() {
completeCb.add(arguments[0]);
return this;
},
validationError : function() {
validationCb.add(arguments[0]);
return this;
},
error: function() {
errorCb.add(arguments[0]);
return this;
}
};
$.post(url, formData)
.success(function(data, textStatus, jqXhr) {
if (!data.Success) {
validationCb.fireWith(callbackContext, [data.Message, data.KeyValuePairs]);
} else {
successCb.fireWith(callbackContext, [data, textStatus, jqXhr]);
}
})
.complete(function (jqXhr, textStatus) {
completeCb.fireWith(callbackContext, [jqXhr, textStatus]);
})
.error(function(jqXhr, textStatus, errorThrown) {
errorCb.fireWith(callbackContext, [jqXhr, textStatus, errorThrown]);
});
return foo;
};
})(jQuery);
那么我所做的事情有多糟糕?我不熟悉 javascript 和 jQuery,我确信我违反了一些注定会咬我的规则。