Created
August 22, 2013 08:44
-
-
Save yuanxu/6304681 to your computer and use it in GitHub Desktop.
与bootstrap兼容的,ajax方式提交表单
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
define(['jquery', 'jqBootstrapValidation', 'bootbox'], function (require, exports) { | |
"use strict"; | |
/*** | |
* 符合promise及bootstrap规范的窗体帮助类. | |
* | |
* 自动绑定到标记有ajaxform类的窗体,并且提供使用jqBootstrapValidation验证功能 | |
* | |
* 需要实例化才能使用 | |
*/ | |
/* | |
var ctls = $('input[name="csrfmiddlewaretoken"]'); | |
if (ctls.length > 0) { | |
$.ajaxSetup({crossDomain: false, // obviates need for sameOrigin test | |
beforeSend: function (xhr, settings) { | |
xhr.setRequestHeader("X-CSRFToken", ctls.val()); | |
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); | |
} | |
}); | |
} | |
*/ | |
var ajaxform = function (form, opts) { | |
var $ = require('jquery'); | |
var $form = undefined; | |
var originAction = form.action == '' ? window.location.href : form.action; | |
function Deferred() { | |
var _doneFuncs = [], _failFuncs = [], _alwaysFunc = []; | |
var self = this; | |
this.done = function (func) { | |
_doneFuncs[_doneFuncs.length] = func; | |
return self; | |
}; | |
this.fail = function (func) { | |
_failFuncs[_failFuncs.length] = func; | |
return self; | |
}; | |
this.always = function (func) { | |
_alwaysFunc[_alwaysFunc.length] = func; | |
return self; | |
}; | |
this.resolve = function () { | |
for (var i = 0; i < _doneFuncs.length; i++) { | |
var func = _doneFuncs[i]; | |
func(arguments) | |
} | |
}; | |
this.reject = function () { | |
for (var i = 0; i < _failFuncs.length; i++) { | |
var func = _failFuncs[i]; | |
func(arguments) | |
} | |
}; | |
this.always = function () { | |
for (var i = 0; i < _alwaysFunc.length; i++) { | |
var func = _alwaysFunc[i]; | |
func(arguments) | |
} | |
} | |
} | |
var defer = new Deferred(); | |
var defaults = { | |
showAlert: false, //通过Alert方式提示成功、出错 | |
alertDivId: undefined, //消息提示的divId。默认采用.errors,考虑好去掉!! | |
delayTime: 2000, //同时包含提示和重定向时的延时时间 | |
stageLoadingButton: true, //将提交按钮设置为'loading状态' | |
useJqBootstrapValidation: true | |
}; | |
var options = $.extend(defaults, opts || {}); | |
options.showAlert = !options.alertDivId && $('.errors').length == 0; | |
if (form != undefined) { | |
$form = $(form); | |
if (options.useJqBootstrapValidation) { | |
require('jqBootstrapValidation'); | |
$("input, select, textarea", $form).not("[type=submit]").jqBootstrapValidation({submitSuccess: function ($form, event) { | |
doSubmit(); | |
event.preventDefault(); | |
return false; | |
}}); | |
} | |
else { | |
$form.submit(function (e) { | |
e.preventDefault(); | |
doSubmit(); | |
return false; | |
}); | |
} | |
} | |
/*** | |
* 提交表单 | |
*/ | |
function doSubmit() { | |
clearErrors(); | |
if (options.preSubmitFunc != undefined) { | |
if (!options.preSubmitFunc()) | |
return; | |
} | |
if (options.stageLoadingButton) { | |
var btn = $('button[type="submit"]', $form); | |
var loadingText = btn.attr('data-loading-text'); | |
if (loadingText == undefined || loadingText == '') { | |
btn.attr('data-loading-text', '<i class="icon-spin icon-spinner"></i> ' + btn.text()); | |
} | |
btn.button('loading'); | |
} | |
$.post(originAction, $form.serializeArray()).done(submitDone).always(function () { | |
if (options.stageLoadingButton) { | |
var btn = $('button[type="submit"]', $form); | |
btn.button('reset'); | |
} | |
}); | |
} | |
function submitDone(data) { | |
var result = data; | |
if (typeof data == 'string') | |
result = $.parseJSON(data); | |
if (result.success) { | |
if (result.msg && result.msg.length > 0) { | |
showMessage(result.msg, false, undefined); | |
} | |
defer.resolve(); | |
} | |
//仅包含常规错误信息 | |
else if (typeof(result.msg) == 'string') { | |
showMessage(result.msg, true, result.redirect); | |
} | |
//包含各控件错误信息 | |
else { | |
clearErrors(); | |
showErrors(result.msg); | |
defer.reject(); | |
} | |
//包含回调 | |
if (!!result.redirect) { | |
window.location = result.redirect; | |
} | |
} | |
/** | |
* 清除错误 | |
*/ | |
function clearErrors() { | |
$('.control-group', $form).removeClass('error'); | |
$('.help-block', $form).html(''); | |
$('.help-inline', $form).html(''); | |
$('.errors', $form).html('').removeClass('error'); | |
$('#' + options.alertDivId).html(''); | |
} | |
/** | |
* 显示消息 | |
* @param msg 消息内容 | |
* @param isError 是否是错误信息 | |
* @param redirectTo 重定向到 | |
*/ | |
function showMessage(msg, isError, redirectTo) { | |
clearErrors(); | |
var html = ''; | |
if (options.alertDivId) | |
html = $('#' + options.alertDivId); | |
else | |
html = $('.errors', $form); | |
if (options.showAlert || html.length == 0) { | |
var bootbox = require('bootbox'); | |
bootbox.alert(msg, function () { | |
if (!!redirectTo) { | |
window.location = redirectTo; | |
} | |
} | |
); | |
} | |
else { | |
html.html(msg); | |
if (isError) | |
html.addClass('error'); | |
if (!!redirectTo) { | |
window.setTimeout(function () { | |
window.location = redirectTo; | |
}, options.delayTime | |
) | |
} | |
} | |
} | |
/** | |
* 显示错误 | |
* @param errors | |
*/ | |
function showErrors(errors) { | |
var msg = ''; | |
if (errors == undefined) return; | |
$.each(errors, function (k, v) { | |
if (k == '__all__') { | |
var $errors = $('.errors', $form); | |
if ($errors.length > 0) | |
$errors.text(v).addClass('text-error'); | |
else { | |
msg += v + '<br />'; | |
} | |
} else { | |
var controlGroup = $('[name="' + k + '"]', $form).parents('.control-group'); | |
if (controlGroup != undefined && controlGroup.length > 0) { | |
controlGroup.addClass('error'); | |
if (v != 'This field is required.') { //默认不显示This field is required.默认标红即可 | |
var help = $(".help-block", controlGroup); | |
if (help.length == 0) { | |
help = $('.help-inline', controlGroup); | |
} else { | |
help[0].innerText = (v); | |
} | |
} | |
} else { | |
msg += k + " : " + v + '<br />'; | |
} | |
} | |
}); | |
if (msg.length > 0) { | |
showMessage(msg, true, undefined); | |
} | |
} | |
//var promise = defer.promise(); | |
defer.preSubmit = function (func) { | |
options.preSubmitFunc = func; | |
return defer; | |
}; | |
return defer; | |
}; | |
$(document).ready(function () { | |
$('.ajax').each(function (index, obj) { | |
new ajaxform(obj); | |
}); | |
}); | |
//exports.ajaxform = ajaxform; | |
return ajaxform; | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment