后端文件更新
This commit is contained in:
179
public/static/js/require-form.js
Normal file
179
public/static/js/require-form.js
Normal file
@@ -0,0 +1,179 @@
|
||||
define(['jquery', 'sent', 'validator'], function($, Sent, Validator){
|
||||
var Form = {
|
||||
events: {
|
||||
validator: function (form, success, error, submit) {
|
||||
if (!form.is("form")){
|
||||
return;
|
||||
}
|
||||
//绑定表单事件
|
||||
form.validator($.extend({
|
||||
valid: function (ret) {
|
||||
var that = this, submitBtn = $("button.submit-btn", form);
|
||||
that.holdSubmit(true);
|
||||
submitBtn.addClass("disabled");
|
||||
//验证通过提交表单
|
||||
var submitResult = Form.api.submit($(ret), function (data, ret) {
|
||||
that.holdSubmit(false);
|
||||
submitBtn.removeClass("disabled");
|
||||
if (false === $(this).triggerHandler("success.form", [data, ret])) {
|
||||
return false;
|
||||
}
|
||||
if (typeof success === 'function') {
|
||||
if (false === success.call($(this), data, ret)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
//提示及关闭当前窗口
|
||||
var msg = ret.hasOwnProperty("msg") && ret.msg !== "" ? ret.msg : 'Operation completed';
|
||||
parent.Toastr.success(msg);
|
||||
parent.$(".btn-refresh").trigger("click");
|
||||
var index = parent.Layer.getFrameIndex(window.name);
|
||||
parent.Layer.close(index);
|
||||
return false;
|
||||
}, function(data, ret){
|
||||
that.holdSubmit(false);
|
||||
if (false === $(this).triggerHandler("error.form", [data, ret])) {
|
||||
return false;
|
||||
}
|
||||
submitBtn.removeClass("disabled");
|
||||
if (typeof error === 'function') {
|
||||
if (false === error.call($(this), data, ret)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}, submit)
|
||||
//如果提交失败则释放锁定
|
||||
if (!submitResult) {
|
||||
that.holdSubmit(false);
|
||||
submitBtn.removeClass("disabled");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}, form.data("validator-options") || {}))
|
||||
|
||||
//移除提交按钮的disabled类
|
||||
$(".layer-footer [type=submit],.fixed-footer [type=submit],.normal-footer [type=submit]", form).removeClass("disabled");
|
||||
},
|
||||
cxselect: function (form) {
|
||||
//绑定cxselect元素事件
|
||||
if ($("[data-toggle='cxselect']", form).size() > 0) {
|
||||
require(['cxselect'], function () {
|
||||
$.cxSelect.defaults.jsonName = 'name';
|
||||
$.cxSelect.defaults.jsonValue = 'value';
|
||||
$.cxSelect.defaults.jsonSpace = 'data';
|
||||
$("[data-toggle='cxselect']", form).cxSelect();
|
||||
});
|
||||
}
|
||||
},
|
||||
switcher: function (form) {
|
||||
form.on("click", "[data-toggle='switcher']", function () {
|
||||
if ($(this).hasClass("disabled")) {
|
||||
return false;
|
||||
}
|
||||
var input = $(this).prev("input");
|
||||
input = $(this).data("input-id") ? $("#" + $(this).data("input-id")) : input;
|
||||
if (input.size() > 0) {
|
||||
var yes = $(this).data("yes");
|
||||
var no = $(this).data("no");
|
||||
if (input.val() == yes) {
|
||||
input.val(no);
|
||||
$("i", this).addClass("fa-flip-horizontal text-gray");
|
||||
} else {
|
||||
input.val(yes);
|
||||
$("i", this).removeClass("fa-flip-horizontal text-gray");
|
||||
}
|
||||
input.trigger('change');
|
||||
}
|
||||
return false;
|
||||
});
|
||||
},
|
||||
bindevent: function (form) {
|
||||
|
||||
},
|
||||
},
|
||||
api:{
|
||||
submit: function (form, success, error, submit) {
|
||||
if (form.size() === 0) {
|
||||
Toastr.error("表单未初始化完成,无法提交");
|
||||
return false;
|
||||
}
|
||||
if (typeof submit === 'function') {
|
||||
if (false === submit.call(form, success, error)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
var type = form.attr("method") ? form.attr("method").toUpperCase() : 'GET';
|
||||
type = type && (type === 'GET' || type === 'POST') ? type : 'GET';
|
||||
url = form.attr("action");
|
||||
url = url ? url : location.href;
|
||||
//修复当存在多选项元素时提交的BUG
|
||||
var params = {};
|
||||
var multipleList = $("[name$='[]']", form);
|
||||
if (multipleList.size() > 0) {
|
||||
var postFields = form.serializeArray().map(function (obj) {
|
||||
return $(obj).prop("name");
|
||||
});
|
||||
$.each(multipleList, function (i, j) {
|
||||
if (postFields.indexOf($(this).prop("name")) < 0) {
|
||||
params[$(this).prop("name")] = '';
|
||||
}
|
||||
});
|
||||
}
|
||||
//调用Ajax请求方法
|
||||
Sent.api.ajax({
|
||||
type: type,
|
||||
url: url,
|
||||
data: form.serialize() + (Object.keys(params).length > 0 ? '&' + $.param(params) : ''),
|
||||
dataType: 'json',
|
||||
complete: function (xhr) {
|
||||
var token = xhr.getResponseHeader('__token__');
|
||||
if (token) {
|
||||
$("input[name='__token__']", form).val(token);
|
||||
}
|
||||
}
|
||||
}, function (data, ret) {
|
||||
$('.form-group', form).removeClass('has-feedback has-success has-error');
|
||||
if (data && typeof data === 'object') {
|
||||
//刷新客户端token
|
||||
if (typeof data.token !== 'undefined') {
|
||||
$("input[name='__token__']", form).val(data.token);
|
||||
}
|
||||
//调用客户端事件
|
||||
if (typeof data.callback !== 'undefined' && typeof data.callback === 'function') {
|
||||
data.callback.call(form, data);
|
||||
}
|
||||
}
|
||||
if (typeof success === 'function') {
|
||||
if (false === success.call(form, data, ret)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}, function (data, ret) {
|
||||
if (data && typeof data === 'object' && typeof data.token !== 'undefined') {
|
||||
$("input[name='__token__']", form).val(data.token);
|
||||
}
|
||||
if (typeof error === 'function') {
|
||||
if (false === error.call(form, data, ret)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
});
|
||||
return true;
|
||||
},
|
||||
bindevent: function (form, success, error, submit) {
|
||||
form = typeof form === 'object' ? form : $(form);
|
||||
|
||||
var events = Form.events;
|
||||
|
||||
events.bindevent(form);
|
||||
|
||||
events.validator(form, success, error, submit);
|
||||
|
||||
events.cxselect(form);
|
||||
events.switcher(form);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Form;
|
||||
})
|
||||
@@ -1,10 +1,268 @@
|
||||
define(['jquery'], function($){
|
||||
define(['jquery', 'toastr','layer'], function($, Toastr, Layer){
|
||||
var Sent = {
|
||||
config: {
|
||||
//toastr默认配置
|
||||
toastr: {
|
||||
"closeButton": true,
|
||||
"debug": false,
|
||||
"newestOnTop": false,
|
||||
"progressBar": false,
|
||||
"positionClass": "toast-top-center",
|
||||
"preventDuplicates": false,
|
||||
"onclick": null,
|
||||
"showDuration": "300",
|
||||
"hideDuration": "1000",
|
||||
"timeOut": "5000",
|
||||
"extendedTimeOut": "1000",
|
||||
"showEasing": "swing",
|
||||
"hideEasing": "linear",
|
||||
"showMethod": "fadeIn",
|
||||
"hideMethod": "fadeOut"
|
||||
}
|
||||
},
|
||||
|
||||
init: function () {
|
||||
|
||||
|
||||
//公共代码
|
||||
//配置Toastr的参数
|
||||
Toastr.options = Sent.config.toastr;
|
||||
},
|
||||
|
||||
events: {
|
||||
//请求成功的回调
|
||||
onAjaxSuccess: function (ret, onAjaxSuccess) {
|
||||
var data = typeof ret.data !== 'undefined' ? ret.data : null;
|
||||
var msg = typeof ret.msg !== 'undefined' && ret.msg ? ret.msg : 'Operation completed';
|
||||
|
||||
if (typeof onAjaxSuccess === 'function') {
|
||||
var result = onAjaxSuccess.call(this, data, ret);
|
||||
if (result === false)
|
||||
return;
|
||||
}
|
||||
Toastr.success(msg);
|
||||
},
|
||||
//请求错误的回调
|
||||
onAjaxError: function (ret, onAjaxError) {
|
||||
var data = typeof ret.data !== 'undefined' ? ret.data : null;
|
||||
if (typeof onAjaxError === 'function') {
|
||||
var result = onAjaxError.call(this, data, ret);
|
||||
if (result === false) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
Toastr.error(ret.msg);
|
||||
},
|
||||
//服务器响应数据后
|
||||
onAjaxResponse: function (response) {
|
||||
try {
|
||||
var ret = typeof response === 'object' ? response : JSON.parse(response);
|
||||
if (!ret.hasOwnProperty('code')) {
|
||||
$.extend(ret, {code: -2, msg: response, data: null});
|
||||
}
|
||||
} catch (e) {
|
||||
var ret = {code: -1, msg: e.message, data: null};
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
},
|
||||
|
||||
api: {
|
||||
//发送Ajax请求
|
||||
ajax: function (options, success, error) {
|
||||
options = typeof options === 'string' ? {url: options} : options;
|
||||
var index;
|
||||
if (typeof options.loading === 'undefined' || options.loading) {
|
||||
index = Layer.load(options.loading || 0);
|
||||
}
|
||||
options = $.extend({
|
||||
type: "POST",
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
index && Layer.close(index);
|
||||
ret = Sent.events.onAjaxResponse(ret);
|
||||
if (ret.code === 0) {
|
||||
Sent.events.onAjaxSuccess(ret, success);
|
||||
} else {
|
||||
Sent.events.onAjaxError(ret, error);
|
||||
}
|
||||
},
|
||||
error: function (xhr) {
|
||||
index && Layer.close(index);
|
||||
var ret = {code: xhr.status, msg: xhr.statusText, data: null};
|
||||
Sent.events.onAjaxError(ret, error);
|
||||
}
|
||||
}, options);
|
||||
$.ajax(options);
|
||||
},
|
||||
//查询Url参数
|
||||
query: function (name, url) {
|
||||
if (!url) {
|
||||
url = window.location.href;
|
||||
}
|
||||
name = name.replace(/[\[\]]/g, "\\$&");
|
||||
var regex = new RegExp("[?&/]" + name + "([=/]([^&#/?]*)|&|#|$)"),
|
||||
results = regex.exec(url);
|
||||
if (!results)
|
||||
return null;
|
||||
if (!results[2])
|
||||
return '';
|
||||
return decodeURIComponent(results[2].replace(/\+/g, " "));
|
||||
},
|
||||
//打开一个弹出窗口
|
||||
open: function (url, title, options) {
|
||||
title = options && options.title ? options.title : (title ? title : "");
|
||||
//url = Sent.api.fixurl(url);
|
||||
url = url + (url.indexOf("?") > -1 ? "&" : "?") + "dialog=1";
|
||||
var area = Sent.config.openArea != undefined ? Sent.config.openArea : [$(window).width() > 800 ? '800px' : '95%', $(window).height() > 600 ? '600px' : '95%'];
|
||||
options = $.extend({
|
||||
type: 2,
|
||||
title: title,
|
||||
shadeClose: true,
|
||||
shade: false,
|
||||
maxmin: true,
|
||||
moveOut: true,
|
||||
area: area,
|
||||
content: url,
|
||||
zIndex: Layer.zIndex,
|
||||
success: function (layero, index) {
|
||||
var that = this;
|
||||
//存储callback事件
|
||||
$(layero).data("callback", that.callback);
|
||||
//$(layero).removeClass("layui-layer-border");
|
||||
Layer.setTop(layero);
|
||||
try {
|
||||
var frame = Layer.getChildFrame('html', index);
|
||||
var layerfooter = frame.find(".layer-footer");
|
||||
Sent.api.layerfooter(layero, index, that);
|
||||
|
||||
//绑定事件
|
||||
if (layerfooter.size() > 0) {
|
||||
// 监听窗口内的元素及属性变化
|
||||
// Firefox和Chrome早期版本中带有前缀
|
||||
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
|
||||
if (MutationObserver) {
|
||||
// 选择目标节点
|
||||
var target = layerfooter[0];
|
||||
// 创建观察者对象
|
||||
var observer = new MutationObserver(function (mutations) {
|
||||
Sent.api.layerfooter(layero, index, that);
|
||||
mutations.forEach(function (mutation) {
|
||||
});
|
||||
});
|
||||
// 配置观察选项:
|
||||
var config = {attributes: true, childList: true, characterData: true, subtree: true}
|
||||
// 传入目标节点和观察选项
|
||||
observer.observe(target, config);
|
||||
// 随后,你还可以停止观察
|
||||
// observer.disconnect();
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
if ($(layero).height() > $(window).height()) {
|
||||
//当弹出窗口大于浏览器可视高度时,重定位
|
||||
Layer.style(index, {
|
||||
top: 0,
|
||||
height: $(window).height()
|
||||
});
|
||||
}
|
||||
}
|
||||
}, options ? options : {});
|
||||
if ($(window).width() < 480 || (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream && top.$(".tab-pane.active").size() > 0)) {
|
||||
options.area = [top.$(".tab-pane.active").width() + "px", top.$(".tab-pane.active").height() + "px"];
|
||||
options.offset = [top.$(".tab-pane.active").scrollTop() + "px", "0px"];
|
||||
}
|
||||
return Layer.open(options);
|
||||
},
|
||||
//关闭窗口并回传数据
|
||||
close: function (data) {
|
||||
var index = parent.Layer.getFrameIndex(window.name);
|
||||
var callback = parent.$("#layui-layer" + index).data("callback");
|
||||
//再执行关闭
|
||||
parent.Layer.close(index);
|
||||
//再调用回传函数
|
||||
if (typeof callback === 'function') {
|
||||
callback.call(undefined, data);
|
||||
}
|
||||
},
|
||||
layerfooter: function (layero, index, that) {
|
||||
var frame = Layer.getChildFrame('html', index);
|
||||
var layerfooter = frame.find(".layer-footer");
|
||||
if (layerfooter.size() > 0) {
|
||||
$(".layui-layer-footer", layero).remove();
|
||||
var footer = $("<div />").addClass('layui-layer-btn layui-layer-footer');
|
||||
footer.html(layerfooter.html());
|
||||
if ($(".row", footer).size() === 0) {
|
||||
$(">", footer).wrapAll("<div class='row'></div>");
|
||||
}
|
||||
footer.insertAfter(layero.find('.layui-layer-content'));
|
||||
//绑定事件
|
||||
footer.on("click", ".btn", function () {
|
||||
if ($(this).hasClass("disabled") || $(this).parent().hasClass("disabled")) {
|
||||
return;
|
||||
}
|
||||
var index = footer.find('.btn').index(this);
|
||||
$(".btn:eq(" + index + ")", layerfooter).trigger("click");
|
||||
});
|
||||
|
||||
var titHeight = layero.find('.layui-layer-title').outerHeight() || 0;
|
||||
var btnHeight = layero.find('.layui-layer-btn').outerHeight() || 0;
|
||||
//重设iframe高度
|
||||
$("iframe", layero).height(layero.height() - titHeight - btnHeight);
|
||||
}
|
||||
//修复iOS下弹出窗口的高度和iOS下iframe无法滚动的BUG
|
||||
if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {
|
||||
var titHeight = layero.find('.layui-layer-title').outerHeight() || 0;
|
||||
var btnHeight = layero.find('.layui-layer-btn').outerHeight() || 0;
|
||||
$("iframe", layero).parent().css("height", layero.height() - titHeight - btnHeight);
|
||||
$("iframe", layero).css("height", "100%");
|
||||
}
|
||||
},
|
||||
success: function (options, callback) {
|
||||
var type = typeof options === 'function';
|
||||
if (type) {
|
||||
callback = options;
|
||||
}
|
||||
return Layer.msg('Operation completed', $.extend({
|
||||
offset: 0, icon: 1
|
||||
}, type ? {} : options), callback);
|
||||
},
|
||||
error: function (options, callback) {
|
||||
var type = typeof options === 'function';
|
||||
if (type) {
|
||||
callback = options;
|
||||
}
|
||||
return Layer.msg('Operation failed', $.extend({
|
||||
offset: 0, icon: 2
|
||||
}, type ? {} : options), callback);
|
||||
},
|
||||
msg: function (message, url) {
|
||||
var callback = typeof url === 'function' ? url : function () {
|
||||
if (typeof url !== 'undefined' && url) {
|
||||
location.href = url;
|
||||
}
|
||||
};
|
||||
Layer.msg(message, {
|
||||
time: 2000
|
||||
}, callback);
|
||||
},
|
||||
toastr: Toastr,
|
||||
layer: Layer
|
||||
}
|
||||
};
|
||||
|
||||
if($('form').length > 0){
|
||||
require(['form'], function(Form){
|
||||
Form.api.bindevent($("form"));
|
||||
})
|
||||
}
|
||||
//将Layer暴露到全局中去
|
||||
window.Layer = Layer;
|
||||
//将Toastr暴露到全局中去
|
||||
window.Toastr = Toastr;
|
||||
//将Fast渲染至全局
|
||||
window.Sent = Sent;
|
||||
|
||||
Sent.init(); //默认初始化执行的代码
|
||||
return Sent;
|
||||
|
||||
Reference in New Issue
Block a user