Skip to content

Instantly share code, notes, and snippets.

@yuanxu
Created August 22, 2013 08:44
Show Gist options
  • Save yuanxu/6304681 to your computer and use it in GitHub Desktop.
Save yuanxu/6304681 to your computer and use it in GitHub Desktop.
与bootstrap兼容的,ajax方式提交表单
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