frontend.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. define(['yzn'], function(Yzn) {
  2. var Frontend = {
  3. api: Yzn.api,
  4. init: function() {
  5. var si = {};
  6. //发送验证码
  7. $(document).on("click", ".btn-captcha", function(e) {
  8. var type = $(this).data("type") ? $(this).data("type") : 'mobile';
  9. var btn = this;
  10. Frontend.api.sendcaptcha = function(btn, type, data, callback) {
  11. $(btn).addClass("layui-btn-disabled", true).text("发送中...");
  12. Frontend.api.ajax({ url: $(btn).data("url"), data: data }, function(data, ret) {
  13. clearInterval(si[type]);
  14. var seconds = 60;
  15. si[type] = setInterval(function() {
  16. seconds--;
  17. if (seconds <= 0) {
  18. clearInterval(si);
  19. $(btn).removeClass("layui-btn-disabled").text("发送验证码");
  20. } else {
  21. $(btn).addClass("layui-btn-disabled").text(seconds + "秒后可再次发送");
  22. }
  23. }, 1000);
  24. if (typeof callback == 'function') {
  25. callback.call(this, data, ret);
  26. }
  27. }, function() {
  28. $(btn).removeClass("layui-btn-disabled").text('发送验证码');
  29. });
  30. };
  31. if (['mobile', 'email'].indexOf(type) > -1) {
  32. var element = $(this).data("input-id") ? $("#" + $(this).data("input-id")) : $("input[name='" + type + "']", $(this).closest("form"));
  33. var text = type === 'email' ? '邮箱' : '手机号码';
  34. if (element.val() === "") {
  35. Layer.msg(text + "不能为空!", { icon: 2 });
  36. element.focus();
  37. return false;
  38. } else if (type === 'mobile' && !element.val().match(/^1[3-9]\d{9}$/)) {
  39. Layer.msg("请输入正确的" + text + "!", { icon: 2 });
  40. element.focus();
  41. return false;
  42. } else if (type === 'email' && !element.val().match(/^[\w\+\-]+(\.[\w\+\-]+)*@[a-z\d\-]+(\.[a-z\d\-]+)*\.([a-z]{2,4})$/)) {
  43. Layer.msg("请输入正确的" + text + "!", { icon: 2 });
  44. element.focus();
  45. return false;
  46. }
  47. var data = { event: $(btn).data("event") };
  48. data[type] = element.val();
  49. Frontend.api.sendcaptcha(btn, type, data);
  50. } else {
  51. var data = { event: $(btn).data("event") };
  52. Frontend.api.sendcaptcha(btn, type, data, function(data, ret) {
  53. Layer.open({ title: false, area: ["400px", "430px"], content: "<img src='" + data.image + "' width='400' height='400' /><div class='text-center panel-title'>扫一扫关注公众号获取验证码</div>", type: 1 });
  54. });
  55. }
  56. return false;
  57. });
  58. //阻止IE7以下访问
  59. if (layui.device.ie && layui.device.ie < 10) {
  60. Layer.alert('如果您非得使用 IE 浏览器访问,那么请使用 IE10+');
  61. }
  62. $('.lay-tips').hover(function() {
  63. var title = $(this).attr('title');
  64. Layer.tips(title, $(this))
  65. }, function() {
  66. Layer.closeAll('tips')
  67. })
  68. //手机端顶部导航切换 - 优化版(防止头部拉长)
  69. $(document).on("click", ".fly-header .navbar-toggle", function(e) {
  70. e.stopPropagation();
  71. var $navbarCollapse = $('.fly-header .navbar-collapse');
  72. var $iconBars = $('.fly-header .navbar-toggle .icon-bar');
  73. if ($navbarCollapse.hasClass('layui-hide')) {
  74. $navbarCollapse.removeClass('layui-hide').addClass('layui-show');
  75. // 汉堡菜单动画
  76. $iconBars.eq(0).css({
  77. 'transform': 'rotate(45deg)',
  78. 'transform-origin': 'center',
  79. 'width': '20px'
  80. });
  81. $iconBars.eq(1).css('opacity', '0');
  82. $iconBars.eq(2).css({
  83. 'transform': 'rotate(-45deg)',
  84. 'transform-origin': 'center',
  85. 'width': '20px'
  86. });
  87. } else {
  88. $navbarCollapse.addClass('layui-hide').removeClass('layui-show');
  89. // 恢复汉堡菜单
  90. $iconBars.css({
  91. 'transform': 'none',
  92. 'opacity': '1',
  93. 'width': '20px'
  94. });
  95. }
  96. });
  97. // 点击菜单外部区域关闭菜单
  98. $(document).on("click", function(e) {
  99. var $navbarCollapse = $('.fly-header .navbar-collapse');
  100. var $toggle = $('.fly-header .navbar-toggle');
  101. var $iconBars = $('.fly-header .navbar-toggle .icon-bar');
  102. if (!$(e.target).closest('.navbar-collapse').length &&
  103. !$(e.target).closest('.navbar-toggle').length &&
  104. !$navbarCollapse.hasClass('layui-hide')) {
  105. $navbarCollapse.addClass('layui-hide').removeClass('layui-show');
  106. $iconBars.css({
  107. 'transform': 'none',
  108. 'opacity': '1',
  109. 'width': '20px'
  110. });
  111. }
  112. });
  113. //手机设备的简单适配
  114. var treeMobile = $('.site-tree-mobile'),
  115. shadeMobile = $('.site-mobile-shade')
  116. treeMobile.on('click', function() {
  117. $('body').addClass('site-mobile');
  118. });
  119. shadeMobile.on('click', function() {
  120. $('body').removeClass('site-mobile');
  121. });
  122. // 移动端触摸优化 - 防止双击缩放
  123. var lastTouchEnd = 0;
  124. document.addEventListener('touchend', function(event) {
  125. var now = Date.now();
  126. if (now - lastTouchEnd <= 300) {
  127. event.preventDefault();
  128. }
  129. lastTouchEnd = now;
  130. }, false);
  131. // 移动端菜单滑动关闭支持
  132. var touchStartY = 0;
  133. var touchEndY = 0;
  134. var sideMenu = $('.fly-aside');
  135. sideMenu.on('touchstart', function(e) {
  136. touchStartY = e.originalEvent.touches[0].clientY;
  137. });
  138. sideMenu.on('touchmove', function(e) {
  139. touchEndY = e.originalEvent.touches[0].clientY;
  140. });
  141. sideMenu.on('touchend', function(e) {
  142. var diff = touchStartY - touchEndY;
  143. // 向左滑动关闭菜单
  144. if (Math.abs(diff) < 10 && $('body').hasClass('site-mobile')) {
  145. $('body').removeClass('site-mobile');
  146. }
  147. });
  148. // 移动端输入框自动聚焦优化
  149. $(document).on('focus', 'input, textarea', function() {
  150. if ($(window).width() < 768) {
  151. setTimeout(function() {
  152. window.scrollTo(0, document.body.scrollTop);
  153. }, 100);
  154. }
  155. });
  156. // 移动端图片点击放大优化
  157. $(document).on('click', '.fly-panel img:not(.fly-avatar)', function() {
  158. if ($(window).width() < 768) {
  159. var src = $(this).attr('src');
  160. if (src && !$(this).closest('.layui-layer').length) {
  161. layer.open({
  162. type: 1,
  163. backgroundColor: 'rgba(0,0,0,0.9)',
  164. shade: false,
  165. area: ['100%', '100%'],
  166. content: '<div style="display:flex;align-items:center;justify-content:center;height:100vh;"><img src="' + src + '" style="max-width:100%;max-height:100vh;" onclick="layer.closeAll()"></div>',
  167. success: function(layero) {
  168. layero.on('click', function() {
  169. layer.closeAll();
  170. });
  171. }
  172. });
  173. }
  174. }
  175. });
  176. }
  177. };
  178. Frontend.api = $.extend(Yzn.api, Frontend.api);
  179. //将Frontend渲染至全局,以便于在子框架中调用
  180. window.Frontend = Frontend;
  181. Frontend.init();
  182. return Frontend;
  183. });