yzn.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. define(['jquery', 'toastr', 'layui'], function ($, Toastr, layui) {
  2. var Layer =layui.layer;
  3. var Yzn = {
  4. config: {
  5. //toastr默认配置
  6. toastr: {
  7. "closeButton": true,
  8. "debug": false,
  9. "newestOnTop": false,
  10. "progressBar": false,
  11. "positionClass": "toast-top-center",
  12. "preventDuplicates": false,
  13. "onclick": null,
  14. "showDuration": "300",
  15. "hideDuration": "1000",
  16. "timeOut": "5000",
  17. "extendedTimeOut": "1000",
  18. "showEasing": "swing",
  19. "hideEasing": "linear",
  20. "showMethod": "fadeIn",
  21. "hideMethod": "fadeOut"
  22. }
  23. },
  24. events: {
  25. //请求成功的回调
  26. onAjaxSuccess: function (ret, onAjaxSuccess) {
  27. var data = typeof ret.data !== 'undefined' ? ret.data : null;
  28. var msg = typeof ret.msg !== 'undefined' && ret.msg ? ret.msg : '操作成功!';
  29. if (typeof onAjaxSuccess === 'function') {
  30. var result = onAjaxSuccess.call(this, data, ret);
  31. if (result === false)
  32. return;
  33. }
  34. Toastr.success(msg);
  35. },
  36. //请求错误的回调
  37. onAjaxError: function (ret, onAjaxError) {
  38. var data = typeof ret.data !== 'undefined' ? ret.data : null;
  39. if (typeof onAjaxError === 'function') {
  40. var result = onAjaxError.call(this, data, ret);
  41. if (result === false) {
  42. return;
  43. }
  44. }
  45. Toastr.error(ret.msg);
  46. },
  47. //服务器响应数据后
  48. onAjaxResponse: function (response) {
  49. try {
  50. var ret = typeof response === 'object' ? response : JSON.parse(response);
  51. if (!ret.hasOwnProperty('code')) {
  52. $.extend(ret, {code: -2, msg: response, data: null});
  53. }
  54. } catch (e) {
  55. var ret = {code: -1, msg: e.message, data: null};
  56. }
  57. return ret;
  58. }
  59. },
  60. api: {
  61. parame: function(param, defaultParam) {
  62. return param !== undefined ? param : defaultParam;
  63. },
  64. checkAuth: function (node,ele) {
  65. /*if (CONFIG.IS_SUPER_ADMIN) {
  66. return true;
  67. }*/
  68. var attr = $(ele).data("auth-" + node);
  69. if (typeof attr === 'undefined' || attr) {
  70. return true;
  71. }
  72. if(node.indexOf('?')>=0) node = node.replace(/([?#])[^'"]*/, ''); //去除参数
  73. if ($(ele).attr('data-auth-' + node.toLowerCase()) === '1') {
  74. return true;
  75. } else {
  76. return false;
  77. }
  78. },
  79. checkMobile: function() {
  80. var userAgentInfo = navigator.userAgent;
  81. var mobileAgents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
  82. var mobile_flag = false;
  83. //根据userAgent判断是否是手机
  84. for (var v = 0; v < mobileAgents.length; v++) {
  85. if (userAgentInfo.indexOf(mobileAgents[v]) > 0) {
  86. mobile_flag = true;
  87. break;
  88. }
  89. }
  90. var screen_width = window.screen.width;
  91. var screen_height = window.screen.height;
  92. //根据屏幕分辨率判断是否是手机
  93. if (screen_width < 600 && screen_height < 800) {
  94. mobile_flag = true;
  95. }
  96. return mobile_flag;
  97. },
  98. //发送Ajax请求
  99. ajax: function (options, success, error) {
  100. options = typeof options === 'string' ? {url: options} : options;
  101. var index;
  102. if (typeof options.loading === 'undefined' || options.loading) {
  103. index = Layer.load(options.loading || 0);
  104. }
  105. options = $.extend({
  106. type: "POST",
  107. dataType: "json",
  108. xhrFields: {
  109. withCredentials: true
  110. },
  111. success: function (ret) {
  112. index && Layer.close(index);
  113. ret = Yzn.events.onAjaxResponse(ret);
  114. if (ret.code === 1) {
  115. Yzn.events.onAjaxSuccess(ret, success);
  116. } else {
  117. Yzn.events.onAjaxError(ret, error);
  118. }
  119. },
  120. error: function (xhr) {
  121. index && Layer.close(index);
  122. var ret = {code: xhr.status, msg: xhr.statusText, data: null};
  123. Yzn.events.onAjaxError(ret, error);
  124. }
  125. }, options);
  126. return $.ajax(options);
  127. },
  128. //修复URL
  129. fixurl: function (url) {
  130. if (url.substr(0, 1) !== "/") {
  131. var r = new RegExp('^(?:[a-z]+:)?//', 'i');
  132. if (!r.test(url)) {
  133. url = Config.moduleurl + "/" + url;
  134. }
  135. } else if (url.substr(0, 8) === "/addons/") {
  136. url = Config.__PUBLIC__.replace(/(\/*$)/g, "") + url;
  137. }
  138. return url;
  139. },
  140. //获取修复后可访问的cdn链接
  141. cdnurl: function (url, domain) {
  142. var rule = new RegExp("^((?:[a-z]+:)?\\/\\/|data:image\\/)", "i");
  143. var cdnurl = Config.upload.cdnurl;
  144. if (typeof domain === 'undefined' || domain === true || cdnurl.indexOf("/") === 0) {
  145. url = rule.test(url) || (cdnurl && url.indexOf(cdnurl) === 0) ? url : cdnurl + url;
  146. }
  147. if (domain && !rule.test(url)) {
  148. domain = typeof domain === 'string' ? domain : location.origin;
  149. url = domain + url;
  150. }
  151. return url;
  152. },
  153. //查询Url参数
  154. query: function (name, url) {
  155. if (!url) {
  156. url = window.location.href;
  157. }
  158. if (!name)
  159. return '';
  160. name = name.replace(/[\[\]]/g, "\\$&");
  161. var regex = new RegExp("[?&/]" + name + "([=/]([^&#/?]*)|&|#|$)"),
  162. results = regex.exec(url);
  163. if (!results)
  164. return null;
  165. if (!results[2])
  166. return '';
  167. return decodeURIComponent(results[2].replace(/\+/g, " "));
  168. },
  169. //打开一个弹出窗口
  170. open: function (url, title, options) {
  171. title = options && options.title ? options.title : (title ? title : "");
  172. url = Yzn.api.fixurl(url);
  173. url = url + (url.indexOf("?") > -1 ? "&" : "?") + "dialog=1";
  174. var area = Yzn.config.openArea != undefined ? Yzn.config.openArea : [$(window).width() > 800 ? '800px' : '95%', $(window).height() > 600 ? '600px' : '95%'];
  175. var success = options && typeof options.success === 'function' ? options.success : $.noop;
  176. if (options && typeof options.success === 'function') {
  177. delete options.success;
  178. }
  179. options = $.extend({
  180. type: 2,
  181. title: title,
  182. shadeClose: true,
  183. shade: false,
  184. maxmin: true,
  185. moveOut: true,
  186. area: area,
  187. content: url,
  188. zIndex: Layer.zIndex,
  189. success: function (layero, index) {
  190. var that = this;
  191. //存储callback事件
  192. $(layero).data("callback", that.callback);
  193. //$(layero).removeClass("layui-layer-border");
  194. Layer.setTop(layero);
  195. try {
  196. var frame = Layer.getChildFrame('html', index);
  197. var layerfooter = frame.find(".layer-footer");
  198. Yzn.api.layerfooter(layero, index, that);
  199. //绑定事件
  200. if (layerfooter.length > 0) {
  201. // 监听窗口内的元素及属性变化
  202. // Firefox和Chrome早期版本中带有前缀
  203. var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
  204. if (MutationObserver) {
  205. // 选择目标节点
  206. var target = layerfooter[0];
  207. // 创建观察者对象
  208. var observer = new MutationObserver(function (mutations) {
  209. Yzn.api.layerfooter(layero, index, that);
  210. mutations.forEach(function (mutation) {
  211. });
  212. });
  213. // 配置观察选项:
  214. var config = {attributes: true, childList: true, characterData: true, subtree: true}
  215. // 传入目标节点和观察选项
  216. observer.observe(target, config);
  217. // 随后,你还可以停止观察
  218. // observer.disconnect();
  219. }
  220. }
  221. } catch (e) {
  222. }
  223. if ($(layero).height() > $(window).height()) {
  224. //当弹出窗口大于浏览器可视高度时,重定位
  225. Layer.style(index, {
  226. top: 0,
  227. height: $(window).height()
  228. });
  229. }
  230. success.call(this, layero, index);
  231. }
  232. }, options ? options : {});
  233. return Layer.open(options);
  234. },
  235. //关闭窗口并回传数据
  236. close: function (data) {
  237. var index = parent.Layer.getFrameIndex(window.name);
  238. var callback = parent.$("#layui-layer" + index).data("callback");
  239. //再执行关闭
  240. parent.Layer.close(index);
  241. //再调用回传函数
  242. if (typeof callback === 'function') {
  243. callback.call(undefined, data);
  244. }
  245. },
  246. layerfooter: function (layero, index, that) {
  247. var frame = Layer.getChildFrame('html', index);
  248. var layerfooter = frame.find(".layer-footer");
  249. if (layerfooter.length > 0) {
  250. $(".layui-layer-footer", layero).remove();
  251. var footer = $("<div />").addClass('layui-layer-btn layui-layer-footer');
  252. footer.html(layerfooter.html());
  253. /*if ($(".row", footer).length === 0) {
  254. $(">", footer).wrapAll("<div class='row'></div>");
  255. }*/
  256. footer.insertAfter(layero.find('.layui-layer-content'));
  257. //绑定事件
  258. footer.on("click", ".layui-btn", function() {
  259. if ($(this).hasClass("disabled") || $(this).parent().hasClass("disabled")) {
  260. return;
  261. }
  262. var index = footer.find('.layui-btn').index(this);
  263. $(".layui-btn:eq(" + index + ")", layerfooter).trigger("click");
  264. });
  265. var titHeight = layero.find('.layui-layer-title').outerHeight() || 0;
  266. var btnHeight = layero.find('.layui-layer-btn').outerHeight() || 0;
  267. //重设iframe高度
  268. $("iframe", layero).height(layero.height() - titHeight - btnHeight);
  269. }
  270. //修复iOS下弹出窗口的高度和iOS下iframe无法滚动的BUG
  271. if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {
  272. var titHeight = layero.find('.layui-layer-title').outerHeight() || 0;
  273. var btnHeight = layero.find('.layui-layer-btn').outerHeight() || 0;
  274. $("iframe", layero).parent().css("height", layero.height() - titHeight - btnHeight);
  275. $("iframe", layero).css("height", "100%");
  276. }
  277. },
  278. success: function (options, callback) {
  279. var type = typeof options === 'function';
  280. if (type) {
  281. callback = options;
  282. }
  283. return Layer.msg('操作成功!', $.extend({
  284. offset: 0, icon: 1
  285. }, type ? {} : options), callback);
  286. },
  287. error: function (options, callback) {
  288. var type = typeof options === 'function';
  289. if (type) {
  290. callback = options;
  291. }
  292. return Layer.msg('操作失败!', $.extend({
  293. offset: 0, icon: 2
  294. }, type ? {} : options), callback);
  295. },
  296. msg: function (message, url) {
  297. var callback = typeof url === 'function' ? url : function () {
  298. if (typeof url !== 'undefined' && url) {
  299. location.href = url;
  300. }
  301. };
  302. Layer.msg(message, {
  303. time: 2000
  304. }, callback);
  305. },
  306. toastr: Toastr,
  307. layer: Layer
  308. },
  309. cache: {
  310. table: 'yzncms',
  311. setTable: function(name) {
  312. this.table = name;
  313. return this;
  314. },
  315. getTable: function() {
  316. return this.table;
  317. },
  318. set: function(key, value) {
  319. var param = { key: key };
  320. if (value != null) {
  321. param.value = value;
  322. } else {
  323. param.remove = true;
  324. }
  325. layui.data(this.table, param);
  326. return this;
  327. },
  328. get: function(key) {
  329. return layui.data(this.table)[key] || false;
  330. },
  331. delete: function(key) {
  332. layui.data(this.table, {
  333. key: key,
  334. remove: true
  335. });
  336. return this;
  337. },
  338. },
  339. init: function () {
  340. // jQuery兼容处理
  341. $.fn.extend({
  342. size: function () {
  343. return $(this).length;
  344. }
  345. });
  346. // 对相对地址进行处理
  347. $.ajaxSetup({
  348. beforeSend: function (xhr, setting) {
  349. setting.url = Yzn.api.fixurl(setting.url);
  350. }
  351. });
  352. Layer.config({
  353. skin: 'layui-layer-yzn'
  354. });
  355. // 绑定ESC关闭窗口事件
  356. $(window).keyup(function (e) {
  357. if (e.keyCode == 27) {
  358. if ($(".layui-layer").length > 0) {
  359. var index = 0;
  360. $(".layui-layer").each(function () {
  361. index = Math.max(index, parseInt($(this).attr("times")));
  362. });
  363. if (index) {
  364. Layer.close(index);
  365. }
  366. }
  367. }
  368. });
  369. //公共代码
  370. //配置Toastr的参数
  371. Toastr.options = Yzn.config.toastr;
  372. }
  373. };
  374. //将Layer暴露到全局中去
  375. window.Layer = Layer;
  376. //将Toastr暴露到全局中去
  377. window.Toastr = Toastr;
  378. //将Yzn渲染至全局
  379. window.Yzn = Yzn;
  380. //默认初始化执行的代码
  381. Yzn.init();
  382. return Yzn;
  383. });