/** Core script to handle the entire theme and core functions **/ var App = function () { // IE mode var isRTL = false; var isIE8 = false; var isIE9 = false; var isIE10 = false; var resizeHandlers = []; var basePath = '../'; var globalImgPath = '3rd/AdminLTE/dist/img/'; var globalPluginsPath = 'base/plugins/'; var globalCssPath = 'global/css/'; // theme layout color set var brandColors = { 'blue': '#89C4F4', 'red': '#F3565D', 'green': '#1bbc9b', 'purple': '#9b59b6', 'grey': '#95a5a6', 'yellow': '#F8CB00', 'lightblue': '364150' }; // initializes main settings var handleInit = function () { if ($('body').css('direction') === 'rtl') { isRTL = true; } isIE8 = !!navigator.userAgent.match(/MSIE 8.0/); isIE9 = !!navigator.userAgent.match(/MSIE 9.0/); isIE10 = !!navigator.userAgent.match(/MSIE 10.0/); if (isIE10) { $('html').addClass('ie10'); // detect IE10 version } if (isIE10 || isIE9 || isIE8) { $('html').addClass('ie'); // detect IE10 version } }; // runs callback functions set by App.addResponsiveHandler(). var _runResizeHandlers = function () { // reinitialize other subscribed elements for (var i = 0; i < resizeHandlers.length; i++) { var each = resizeHandlers[i]; each.call(); } }; //初始化iframe内容页高度 var handleIframeContent = function () { var ht = $(window).height();//获取浏览器窗口的整体高度; var $footer = $(".main-footer"); var $header = $(".main-header"); var $tabs = $(".content-tabs"); var height = App.getViewPort().height - $footer.outerHeight() - $header.outerHeight(); if ($tabs.is(":visible")) { height = height - $tabs.outerHeight(true)-5;//原来-5 modify by xue lei on 2019-3-19 } height = height - 1; $(".tab_iframe").css({ height: height, width: "100%" }); //var width = App.getViewPort().width- $(".page-sidebar-menu").width(); /*$(".tab_iframe").css({ });*/ }; //初始化内容页layout组件高度 var handleIframeLayoutHeight = function () { var height = App.getViewPort().height - $('.page-footer').outerHeight() - $('.page-header').outerHeight() - $(".content-tabs").height(); // $("#layout").css({ "height": height }); return height; }; var handleSiderBarmenu = function () { jQuery('.page-sidebar-menu').on('click', ' li > a.iframeOpen', function (e) { e.preventDefault(); App.scrollTop(); $("#iframe-main").attr("src", $(this).attr('href')); }); }; var isFullScreen = false; var requestFullScreen = function () { var de = document.documentElement; if (de.requestFullscreen) { de.requestFullscreen(); } else if (de.mozRequestFullScreen) { de.mozRequestFullScreen(); } else if (de.webkitRequestFullScreen) { de.webkitRequestFullScreen(); } else if (de.msRequestFullscreen) { de.msRequestFullscreen(); } else { App.alert({message: "该浏览器不支持全屏!", type: "danger"}); } }; var requestFullScreen2 = function (element) { // 判断各种浏览器,找到正确的方法 var requestMethod = element.requestFullScreen || //W3C element.webkitRequestFullScreen || //Chrome等 element.mozRequestFullScreen || //FireFox element.msRequestFullScreen; //IE11 if (requestMethod) { requestMethod.call(element); } else if (typeof window.ActiveXObject !== "undefined" || "ActiveXObject" in window) {//for Internet Explorer var wscript = new ActiveXObject("WScript.Shell"); if (wscript !== null) { wscript.SendKeys("{F11}"); } } }; //退出全屏 判断浏览器种类 var exitFull = function () { // 判断各种浏览器,找到正确的方法 var exitMethod = document.exitFullscreen || //W3C document.mozCancelFullScreen || //Chrome等 document.webkitExitFullscreen || //FireFox document.webkitExitFullscreen; //IE11 if (exitMethod) { exitMethod.call(document); } else if (typeof window.ActiveXObject !== "undefined") {//for Internet Explorer var wscript = new ActiveXObject("WScript.Shell"); if (wscript !== null) { wscript.SendKeys("{F11}"); } } }; // handle the layout reinitialization on window resize var handleOnResize = function () { var resize; if (isIE8) { var currheight; $(window).resize(function () { if (currheight == document.documentElement.clientHeight) { return; //quite event since only body resized not window. } if (resize) { clearTimeout(resize); } resize = setTimeout(function () { _runResizeHandlers(); handleIframeContent(); }, 50); // wait 50ms until window resize finishes. currheight = document.documentElement.clientHeight; // store last body client height }); } else { $(window).resize(function () { if (resize) { clearTimeout(resize); } resize = setTimeout(function () { _runResizeHandlers(); handleIframeContent(); }, 50); // wait 50ms until window resize finishes. }); } }; // Handles portlet tools & actions var handlePortletTools = function () { // handle portlet remove $('body').on('click', '.portlet > .portlet-title > .tools > a.remove', function (e) { e.preventDefault(); var portlet = $(this).closest(".portlet"); if ($('body').hasClass('page-portlet-fullscreen')) { $('body').removeClass('page-portlet-fullscreen'); } portlet.find('.portlet-title .fullscreen').tooltip('destroy'); portlet.find('.portlet-title > .tools > .reload').tooltip('destroy'); portlet.find('.portlet-title > .tools > .remove').tooltip('destroy'); portlet.find('.portlet-title > .tools > .config').tooltip('destroy'); portlet.find('.portlet-title > .tools > .collapse, .portlet > .portlet-title > .tools > .expand').tooltip('destroy'); portlet.remove(); }); // handle portlet fullscreen $('body').on('click', '.portlet > .portlet-title .fullscreen', function (e) { e.preventDefault(); var portlet = $(this).closest(".portlet"); if (portlet.hasClass('portlet-fullscreen')) { $(this).removeClass('on'); portlet.removeClass('portlet-fullscreen'); $('body').removeClass('page-portlet-fullscreen'); portlet.children('.portlet-body').css('height', 'auto'); } else { var height = App.getViewPort().height - portlet.children('.portlet-title').outerHeight() - parseInt(portlet.children('.portlet-body').css('padding-top')) - parseInt(portlet.children('.portlet-body').css('padding-bottom')); $(this).addClass('on'); portlet.addClass('portlet-fullscreen'); $('body').addClass('page-portlet-fullscreen'); portlet.children('.portlet-body').css('height', height); } }); $('body').on('click', '.portlet > .portlet-title > .tools > a.reload', function (e) { e.preventDefault(); var el = $(this).closest(".portlet").children(".portlet-body"); var url = $(this).attr("data-url"); var error = $(this).attr("data-error-display"); if (url) { App.blockUI({ target: el, animate: true, overlayColor: 'none' }); $.ajax({ type: "GET", cache: false, url: url, dataType: "html", success: function (res) { App.unblockUI(el); el.html(res); App.initAjax() // reinitialize elements & plugins for newly loaded content }, error: function (xhr, ajaxOptions, thrownError) { App.unblockUI(el); var msg = 'Error on reloading the content. Please check your connection and try again.'; if (error == "toastr" && toastr) { toastr.error(msg); } else if (error == "notific8" && $.notific8) { $.notific8('zindex', 11500); $.notific8(msg, { theme: 'ruby', life: 3000 }); } else { alert(msg); } } }); } else { // for demo purpose App.blockUI({ target: el, animate: true, overlayColor: 'none' }); window.setTimeout(function () { App.unblockUI(el); }, 1000); } }); // load ajax data on page init $('.portlet .portlet-title a.reload[data-load="true"]').click(); $('body').on('click', '.portlet > .portlet-title > .tools > .collapse, .portlet .portlet-title > .tools > .expand', function (e) { e.preventDefault(); var el = $(this).closest(".portlet").children(".portlet-body"); if ($(this).hasClass("collapse")) { $(this).removeClass("collapse").addClass("expand"); el.slideUp(200); } else { $(this).removeClass("expand").addClass("collapse"); el.slideDown(200); } }); }; // Handles custom checkboxes & radios using jQuery Uniform plugin var handleUniform = function () { if (!$().uniform) { return; } var test = $("input[type=checkbox]:not(.toggle, .md-check, .md-radiobtn, .make-switch, .icheck), input[type=radio]:not(.toggle, .md-check, .md-radiobtn, .star, .make-switch, .icheck)"); if (test.size() > 0) { test.each(function () { if ($(this).parents(".checker").size() === 0) { $(this).show(); $(this).uniform(); } }); } }; // Handlesmaterial design checkboxes var handleMaterialDesign = function () { // Material design ckeckbox and radio effects $('body').on('click', '.md-checkbox > label, .md-radio > label', function () { var the = $(this); // find the first span which is our circle/bubble var el = $(this).children('span:first-child'); // add the bubble class (we do this so it doesnt show on page load) el.addClass('inc'); // clone it var newone = el.clone(true); // add the cloned version before our original el.before(newone); // remove the original so that it is ready to run on next click $("." + el.attr("class") + ":last", the).remove(); }); if ($('body').hasClass('page-md')) { // Material design click effect // credit where credit's due; http://thecodeplayer.com/walkthrough/ripple-click-effect-google-material-design var element, circle, d, x, y; $('body').on('click', 'a.btn, button.btn, input.btn, label.btn', function (e) { element = $(this); if (element.find(".md-click-circle").length == 0) { element.prepend(""); } circle = element.find(".md-click-circle"); circle.removeClass("md-click-animate"); if (!circle.height() && !circle.width()) { d = Math.max(element.outerWidth(), element.outerHeight()); circle.css({height: d, width: d}); } x = e.pageX - element.offset().left - circle.width() / 2; y = e.pageY - element.offset().top - circle.height() / 2; circle.css({top: y + 'px', left: x + 'px'}).addClass("md-click-animate"); setTimeout(function () { circle.remove(); }, 1000); }); } // Floating labels var handleInput = function (el) { if (el.val() != "") { el.addClass('edited'); } else { el.removeClass('edited'); } } $('body').on('keydown', '.form-md-floating-label .form-control', function (e) { handleInput($(this)); }); $('body').on('blur', '.form-md-floating-label .form-control', function (e) { handleInput($(this)); }); $('.form-md-floating-label .form-control').each(function () { if ($(this).val().length > 0) { $(this).addClass('edited'); } }); }; // Handles custom checkboxes & radios using jQuery iCheck plugin var handleiCheck = function () { if (!$().iCheck) { return; } $('.icheck').each(function () { var checkboxClass = $(this).attr('data-checkbox') ? $(this).attr('data-checkbox') : 'icheckbox_minimal-grey'; var radioClass = $(this).attr('data-radio') ? $(this).attr('data-radio') : 'iradio_minimal-grey'; if (checkboxClass.indexOf('_line') > -1 || radioClass.indexOf('_line') > -1) { $(this).iCheck({ checkboxClass: checkboxClass, radioClass: radioClass, insert: '
' + $(this).attr("data-label") }); } else { $(this).iCheck({ checkboxClass: checkboxClass, radioClass: radioClass }); } }); }; // Handles Bootstrap switches var handleBootstrapSwitch = function () { if (!$().bootstrapSwitch) { return; } $('.make-switch').bootstrapSwitch(); }; // Handles Bootstrap confirmations var handleBootstrapConfirmation = function () { if (!$().confirmation) { return; } $('[data-toggle=confirmation]').confirmation({ container: 'body', btnOkClass: 'btn btn-sm btn-success', btnCancelClass: 'btn btn-sm btn-danger' }); }; // Handles Bootstrap Accordions. var handleAccordions = function () { $('body').on('shown.bs.collapse', '.accordion.scrollable', function (e) { App.scrollTo($(e.target)); }); }; // Handles Bootstrap Tabs. var handleTabs = function () { //activate tab if tab id provided in the URL if (location.hash) { var tabid = encodeURI(location.hash.substr(1)); $('a[href="#' + tabid + '"]').parents('.tab-pane:hidden').each(function () { var tabid = $(this).attr("id"); $('a[href="#' + tabid + '"]').click(); }); $('a[href="#' + tabid + '"]').click(); } if ($().tabdrop) { $('.tabbable-tabdrop .nav-pills, .tabbable-tabdrop .nav-tabs').tabdrop({ text: ' ' }); } }; // Handles Bootstrap Modals. var handleModals = function () { // fix stackable modal issue: when 2 or more modals opened, closing one of modal will remove .modal-open class. $('body').on('hide.bs.modal', function () { if ($('.modal:visible').size() > 1 && $('html').hasClass('modal-open') === false) { $('html').addClass('modal-open'); } else if ($('.modal:visible').size() <= 1) { $('html').removeClass('modal-open'); } }); // fix page scrollbars issue $('body').on('show.bs.modal', '.modal', function () { if ($(this).hasClass("modal-scroll")) { $('body').addClass("modal-open-noscroll"); } }); // fix page scrollbars issue $('body').on('hide.bs.modal', '.modal', function () { $('body').removeClass("modal-open-noscroll"); }); // remove ajax content and remove cache on modal closed $('body').on('hidden.bs.modal', '.modal:not(.modal-cached)', function () { $(this).removeData('bs.modal'); }); }; // Handles Bootstrap Tooltips. var handleTooltips = function () { // global tooltips $('.tooltips').tooltip(); // portlet tooltips $('.portlet > .portlet-title .fullscreen').tooltip({ container: 'body', title: 'Fullscreen' }); $('.portlet > .portlet-title > .tools > .reload').tooltip({ container: 'body', title: 'Reload' }); $('.portlet > .portlet-title > .tools > .remove').tooltip({ container: 'body', title: 'Remove' }); $('.portlet > .portlet-title > .tools > .config').tooltip({ container: 'body', title: 'Settings' }); $('.portlet > .portlet-title > .tools > .collapse, .portlet > .portlet-title > .tools > .expand').tooltip({ container: 'body', title: 'Collapse/Expand' }); }; // Handles Bootstrap Dropdowns var handleDropdowns = function () { /* Hold dropdown on click */ $('body').on('click', '.dropdown-menu.hold-on-click', function (e) { e.stopPropagation(); }); }; var handleAlerts = function () { $('body').on('click', '[data-close="alert"]', function (e) { $(this).parent('.alert').hide(); $(this).closest('.note').hide(); e.preventDefault(); }); $('body').on('click', '[data-close="note"]', function (e) { $(this).closest('.note').hide(); e.preventDefault(); }); $('body').on('click', '[data-remove="note"]', function (e) { $(this).closest('.note').remove(); e.preventDefault(); }); }; // Handle Hower Dropdowns var handleDropdownHover = function () { $('[data-hover="dropdown"]').not('.hover-initialized').each(function () { $(this).dropdownHover(); $(this).addClass('hover-initialized'); }); }; // Handle textarea autosize var handleTextareaAutosize = function () { if (typeof(autosize) == "function") { autosize(document.querySelector('textarea.autosizeme')); } }; // Handles Bootstrap Popovers // last popep popover var lastPopedPopover; var handlePopovers = function () { $('.popovers').popover(); // close last displayed popover $(document).on('click.bs.popover.data-api', function (e) { if (lastPopedPopover) { lastPopedPopover.popover('hide'); } }); }; // Handles scrollable contents using jQuery SlimScroll plugin. var handleScrollers = function () { App.initSlimScroll('.scroller'); }; // Handles Image Preview using jQuery Fancybox plugin var handleFancybox = function () { if (!jQuery.fancybox) { return; } if ($(".fancybox-button").size() > 0) { $(".fancybox-button").fancybox({ groupAttr: 'data-rel', prevEffect: 'none', nextEffect: 'none', closeBtn: true, helpers: { title: { type: 'inside' } } }); } }; // Handles counterup plugin wrapper var handleCounterup = function () { if (!$().counterUp) { return; } $("[data-counter='counterup']").counterUp({ delay: 10, time: 1000 }); }; // Fix input placeholder issue for IE8 and IE9 var handleFixInputPlaceholderForIE = function () { //fix html5 placeholder attribute for ie7 & ie8 if (isIE8 || isIE9) { // ie8 & ie9 // this is html5 placeholder fix for inputs, inputs with placeholder-no-fix class will be skipped(e.g: we need this for password fields) $('input[placeholder]:not(.placeholder-no-fix), textarea[placeholder]:not(.placeholder-no-fix)').each(function () { var input = $(this); if (input.val() === '' && input.attr("placeholder") !== '') { input.addClass("placeholder").val(input.attr('placeholder')); } input.focus(function () { if (input.val() == input.attr('placeholder')) { input.val(''); } }); input.blur(function () { if (input.val() === '' || input.val() == input.attr('placeholder')) { input.val(input.attr('placeholder')); } }); }); } }; // Handle Select2 Dropdowns var handleSelect2 = function () { if ($().select2) { $.fn.select2.defaults.set("theme", "bootstrap"); $('.select2me').select2({ placeholder: "Select", width: 'auto', allowClear: true }); } }; // handle group element heights var handleHeight = function () { $('[data-auto-height]').each(function () { var parent = $(this); var items = $('[data-height]', parent); var height = 0; var mode = parent.attr('data-mode'); var offset = parseInt(parent.attr('data-offset') ? parent.attr('data-offset') : 0); items.each(function () { if ($(this).attr('data-height') == "height") { $(this).css('height', ''); } else { $(this).css('min-height', ''); } var height_ = (mode == 'base-height' ? $(this).outerHeight() : $(this).outerHeight(true)); if (height_ > height) { height = height_; } }); height = height + offset; items.each(function () { if ($(this).attr('data-height') == "height") { $(this).css('height', height); } else { $(this).css('min-height', height); } }); if (parent.attr('data-related')) { $(parent.attr('data-related')).css('height', parent.height()); } }); }; //* END:CORE HANDLERS *// return { //add by xue lei on 2018-3-18 resize: function () { handleOnResize(); }, //main function to initiate the theme init: function () { //IMPORTANT!!!: Do not modify the core handlers call order. //Core handlers handleInit(); // initialize core variables handleOnResize(); // set and handle responsive //UI Component handlers handleMaterialDesign(); // handle material design handleUniform(); // hanfle custom radio & checkboxes handleiCheck(); // handles custom icheck radio and checkboxes handleBootstrapSwitch(); // handle bootstrap switch plugin handleScrollers(); // handles slim scrolling contents handleFancybox(); // handle fancy box handleSelect2(); // handle custom Select2 dropdowns handlePortletTools(); // handles portlet action bar functionality(refresh, configure, toggle, remove) handleAlerts(); //handle closabled alerts handleDropdowns(); // handle dropdowns handleTabs(); // handle tabs handleTooltips(); // handle bootstrap tooltips handlePopovers(); // handles bootstrap popovers handleAccordions(); //handles accordions handleModals(); // handle modals handleBootstrapConfirmation(); // handle bootstrap confirmations handleTextareaAutosize(); // handle autosize textareas handleCounterup(); // handle counterup instances handleSiderBarmenu(); //Handle group element heights this.addResizeHandler(handleHeight); // handle auto calculating height on window resize // Hacks handleFixInputPlaceholderForIE(); //IE8 & IE9 input placeholder issue fix }, //main function to initiate core javascript after ajax complete initAjax: function () { handleUniform(); // handles custom radio & checkboxes handleiCheck(); // handles custom icheck radio and checkboxes handleBootstrapSwitch(); // handle bootstrap switch plugin handleDropdownHover(); // handles dropdown hover handleScrollers(); // handles slim scrolling contents handleSelect2(); // handle custom Select2 dropdowns handleFancybox(); // handle fancy box handleDropdowns(); // handle dropdowns handleTooltips(); // handle bootstrap tooltips handlePopovers(); // handles bootstrap popovers handleAccordions(); //handles accordions handleBootstrapConfirmation(); // handle bootstrap confirmations }, handleFullScreen: function () { if (isFullScreen) { exitFull(); isFullScreen = false; } else { requestFullScreen2(document.documentElement); isFullScreen = true; } }, fixIframeTab: function () { handleIframeContent(); }, getIframeLayoutHeight: function () { return handleIframeLayoutHeight(); }, //init main components initComponents: function () { this.initAjax(); }, fixIframeCotent: function () { setTimeout(function () { //_runResizeHandlers(); handleIframeContent(); }, 50); }, //public function to remember last opened popover that needs to be closed on click setLastPopedPopover: function (el) { lastPopedPopover = el; }, //public function to add callback a function which will be called on window resize addResizeHandler: function (func) { resizeHandlers.push(func); }, //public functon to call _runresizeHandlers runResizeHandlers: function () { _runResizeHandlers(); }, // wrApper function to scroll(focus) to an element scrollTo: function (el, offeset) { var pos = (el && el.size() > 0) ? el.offset().top : 0; if (el) { if ($('body').hasClass('page-header-fixed')) { pos = pos - $('.page-header').height(); } else if ($('body').hasClass('page-header-top-fixed')) { pos = pos - $('.page-header-top').height(); } else if ($('body').hasClass('page-header-menu-fixed')) { pos = pos - $('.page-header-menu').height(); } pos = pos + (offeset ? offeset : -1 * el.height()); } $('html,body').animate({ scrollTop: pos }, 'slow'); }, initSlimScroll: function (el) { $(el).each(function () { if ($(this).attr("data-initialized")) { return; // exit } var height; if ($(this).attr("data-height")) { height = $(this).attr("data-height"); } else { height = $(this).css('height'); } $(this).slimScroll({ allowPageScroll: true, // allow page scroll when the element scroll is ended size: '7px', color: ($(this).attr("data-handle-color") ? $(this).attr("data-handle-color") : '#bbb'), wrapperClass: ($(this).attr("data-wrapper-class") ? $(this).attr("data-wrapper-class") : 'slimScrollDiv'), railColor: ($(this).attr("data-rail-color") ? $(this).attr("data-rail-color") : '#eaeaea'), position: isRTL ? 'left' : 'right', height: height, alwaysVisible: ($(this).attr("data-always-visible") == "1" ? true : false), railVisible: ($(this).attr("data-rail-visible") == "1" ? true : false), disableFadeOut: true }); $(this).attr("data-initialized", "1"); }); }, destroySlimScroll: function (el) { $(el).each(function () { if ($(this).attr("data-initialized") === "1") { // destroy existing instance before updating the height $(this).removeAttr("data-initialized"); $(this).removeAttr("style"); var attrList = {}; // store the custom attribures so later we will reassign. if ($(this).attr("data-handle-color")) { attrList["data-handle-color"] = $(this).attr("data-handle-color"); } if ($(this).attr("data-wrapper-class")) { attrList["data-wrapper-class"] = $(this).attr("data-wrapper-class"); } if ($(this).attr("data-rail-color")) { attrList["data-rail-color"] = $(this).attr("data-rail-color"); } if ($(this).attr("data-always-visible")) { attrList["data-always-visible"] = $(this).attr("data-always-visible"); } if ($(this).attr("data-rail-visible")) { attrList["data-rail-visible"] = $(this).attr("data-rail-visible"); } $(this).slimScroll({ wrapperClass: ($(this).attr("data-wrapper-class") ? $(this).attr("data-wrapper-class") : 'slimScrollDiv'), destroy: true }); var the = $(this); // reassign custom attributes $.each(attrList, function (key, value) { the.attr(key, value); }); } }); }, // function to scroll to the top scrollTop: function () { App.scrollTo(); }, // wrApper function to block element(indicate loading) blockUI: function (options) { options = $.extend(true, {}, options); var html = ''; if (options.animate) { html = '
' + '
' + '
'; } else if (options.iconOnly) { html = '
'; } else if (options.textOnly) { html = '
  ' + (options.message ? options.message : 'LOADING...') + '
'; } else { html = '
  ' + (options.message ? options.message : 'LOADING...') + '
'; } if (options.target) { // element blocking var el = $(options.target); if (el.height() <= ($(window).height())) { options.cenrerY = true; } el.block({ message: html, baseZ: options.zIndex ? options.zIndex : 1000, centerY: options.cenrerY !== undefined ? options.cenrerY : false, css: { top: '10%', border: '0', padding: '0', backgroundColor: 'none' }, overlayCSS: { backgroundColor: options.overlayColor ? options.overlayColor : '#555', opacity: options.boxed ? 0.05 : 0.1, cursor: 'wait' } }); } else { // page blocking $.blockUI({ message: html, baseZ: options.zIndex ? options.zIndex : 1000, css: { border: '0', padding: '0', backgroundColor: 'none' }, overlayCSS: { backgroundColor: options.overlayColor ? options.overlayColor : '#555', opacity: options.boxed ? 0.05 : 0.1, cursor: 'wait' } }); } }, // wrApper function to un-block element(finish loading) unblockUI: function (target) { if (target) { $(target).unblock({ onUnblock: function () { $(target).css('position', ''); $(target).css('zoom', ''); } }); } else { $.unblockUI(); } }, startPageLoading: function (options) { if (options && options.animate) { $('.page-spinner-bar').remove(); $('body').append('
'); } else { $('.page-loading').remove(); $('body').append('
  ' + (options && options.message ? options.message : 'Loading...') + '
'); } }, stopPageLoading: function () { $('.page-loading, .page-spinner-bar').remove(); }, alert: function (options) { options = $.extend(true, { container: "", // alerts parent container(by default placed after the page breadcrumbs) place: "append", // "append" or "prepend" in container type: 'success', // alert's type message: "", // alert's message close: true, // make alert closable reset: true, // close all previouse alerts first focus: true, // auto scroll to the alert after shown closeInSeconds: 0, // auto close after defined seconds icon: "" // put icon before the message }, options); var id = App.getUniqueID("App_alert"); var html = '
' + (options.close ? '' : '') + (options.icon !== "" ? ' ' : '') + options.message + '
'; if (options.reset) { $('.custom-alerts').remove(); } if (!options.container) { if ($('.page-fixed-main-content').size() === 1) { $('.page-fixed-main-content').prepend(html); } else if (($('body').hasClass("page-container-bg-solid") || $('body').hasClass("page-content-white")) && $('.page-head').size() === 0) { $('.page-title').after(html); } else { if ($('.page-bar').size() > 0) { $('.page-bar').after(html); } else { $('.page-breadcrumb, .breadcrumbs').after(html); } } } else { if (options.place == "append") { $(options.container).append(html); } else { $(options.container).prepend(html); } } if (options.focus) { App.scrollTo($('#' + id)); } if (options.closeInSeconds > 0) { setTimeout(function () { $('#' + id).remove(); }, options.closeInSeconds * 1000); } return id; }, // initializes uniform elements initUniform: function (els) { if (els) { $(els).each(function () { if ($(this).parents(".checker").size() === 0) { $(this).show(); $(this).uniform(); } }); } else { handleUniform(); } }, //wrApper function to update/sync jquery uniform checkbox & radios updateUniform: function (els) { $.uniform.update(els); // update the uniform checkbox & radios UI after the actual input control state changed }, //public function to initialize the fancybox plugin initFancybox: function () { handleFancybox(); }, //public helper function to get actual input value(used in IE9 and IE8 due to placeholder attribute not supported) getActualVal: function (el) { el = $(el); if (el.val() === el.attr("placeholder")) { return ""; } return el.val(); }, //public function to get a paremeter by name from URL getURLParameter: function (paramName) { var searchString = window.location.search.substring(1), i, val, params = searchString.split("&"); for (i = 0; i < params.length; i++) { val = params[i].split("="); if (val[0] == paramName) { return unescape(val[1]); } } return null; }, // check for device touch support isTouchDevice: function () { try { document.createEvent("TouchEvent"); return true; } catch (e) { return false; } }, // To get the correct viewport width based on http://andylangton.co.uk/articles/javascript/get-viewport-size-javascript/ getViewPort: function () { var e = window, a = 'inner'; if (!('innerWidth' in window)) { a = 'client'; e = document.documentElement || document.body; } return { width: e[a + 'Width'], height: e[a + 'Height'] }; }, getUniqueID: function (prefix) { return 'prefix_' + Math.floor(Math.random() * (new Date()).getTime()); }, // check IE8 mode isIE8: function () { return isIE8; }, // check IE9 mode isIE9: function () { return isIE9; }, //check RTL mode isRTL: function () { return isRTL; }, // check IE8 mode isAngularJsApp: function () { return (typeof angular == 'undefined') ? false : true; }, getbasePath: function () { return basePath; }, setbasePath: function (path) { basePath = path; }, setGlobalImgPath: function (path) { globalImgPath = path; }, getGlobalImgPath: function () { return basePath + globalImgPath; }, setGlobalPluginsPath: function (path) { globalPluginsPath = path; }, getGlobalPluginsPath: function () { return basePath + globalPluginsPath; }, getGlobalCssPath: function () { return basePath + globalCssPath; }, // get layout color code by color name getBrandColor: function (name) { if (brandColors[name]) { return brandColors[name]; } else { return ''; } }, getResponsiveBreakpoint: function (size) { // bootstrap responsive breakpoints var sizes = { 'xs': 480, // extra small 'sm': 768, // small 'md': 992, // medium 'lg': 1200 // large }; return sizes[size] ? sizes[size] : 0; } }; }(); jQuery(document).ready(function () { //App.init(); // init metronic core componets App.resize(); }); /* * Context.js * Copyright Jacob Kelley * MIT License * * Modified by Joshua Christman */ context = (function () { var options = { fadeSpeed: 100, filter: function ($obj) { // Modify $obj, Do not return }, above: 'auto', left: 'auto', preventDoubleContext: true, compress: false }; function initialize(opts) { options = $.extend({}, options, opts); $(document).on('click', function () { $('.dropdown-context').fadeOut(options.fadeSpeed, function () { $('.dropdown-context').css({display: ''}).find('.drop-left').removeClass('drop-left'); }); }); if (options.preventDoubleContext) { $(document).on('contextmenu', '.dropdown-context', function (e) { e.preventDefault(); }); } $(document).on('mouseenter', '.dropdown-submenu', function () { var $sub = $(this).find('.dropdown-context-sub:first'), subWidth = $sub.width(), subLeft = $sub.offset().left, collision = (subWidth + subLeft) > window.innerWidth; if (collision) { $sub.addClass('drop-left'); } }); } function updateOptions(opts) { options = $.extend({}, options, opts); } function buildMenu(data, id, subMenu) { var subClass = (subMenu) ? ' dropdown-context-sub' : '', compressed = options.compress ? ' compressed-context' : '', $menu = $(''); return buildMenuItems($menu, data, id, subMenu); } function buildMenuItems($menu, data, id, subMenu, addDynamicTag) { var linkTarget = ''; for (var i = 0; i < data.length; i++) { if (typeof data[i].divider !== 'undefined') { var divider = '
  • '; $menu.append(divider); } else if (typeof data[i].header !== 'undefined') { var header = ''; $menu.append(header); } else if (typeof data[i].menu_item_src !== 'undefined') { var funcName; if (typeof data[i].menu_item_src === 'function') { if (data[i].menu_item_src.name === "") { // The function is declared like "foo = function() {}" for (var globalVar in window) { if (data[i].menu_item_src == window[globalVar]) { funcName = globalVar; break; } } } else { funcName = data[i].menu_item_src.name; } } else { funcName = data[i].menu_item_src; } $menu.append('
  • '); } else { if (typeof data[i].href == 'undefined') { data[i].href = '#'; } if (typeof data[i].target !== 'undefined') { linkTarget = ' target="' + data[i].target + '"'; } if (typeof data[i].subMenu !== 'undefined') { var sub_menu = '' $sub = (sub_menu); } else { var element = ''; if (typeof data[i].icon !== 'undefined') element += ' '; element += data[i].text + ''; $sub = $(element); } if (typeof data[i].action !== 'undefined') { $action = data[i].action; $sub .find('a') .addClass('context-event') .on('click', createCallback($action)); } $menu.append($sub); if (typeof data[i].subMenu != 'undefined') { var subMenuData = buildMenu(data[i].subMenu, id, true); $menu.find('li:last').append(subMenuData); } } if (typeof options.filter == 'function') { options.filter($menu.find('li:last')); } } return $menu; } function addContext(selector, data) { if (typeof data.id !== 'undefined' && typeof data.data !== 'undefined') { var id = data.id; $menu = $('body').find('#dropdown-' + id)[0]; if (typeof $menu === 'undefined') { $menu = buildMenu(data.data, id); $('body').append($menu); } } else { var d = new Date(), id = d.getTime(), $menu = buildMenu(data, id); $('body').append($menu); } //右键事件 $(selector).on('contextmenu', function (e) { e.preventDefault(); e.stopPropagation(); rightClickEvent = e; currentContextSelector = $(this); $('.dropdown-context:not(.dropdown-context-sub)').hide(); $dd = $('#dropdown-' + id); $dd.find('.dynamic-menu-item').remove(); // Destroy any old dynamic menu items $dd.find('.dynamic-menu-src').each(function (idx, element) { var menuItems = window[$(element).data('src')]($(selector)); $parentMenu = $(element).closest('.dropdown-menu.dropdown-context'); $parentMenu = buildMenuItems($parentMenu, menuItems, id, undefined, true); }); if (typeof options.above == 'boolean' && options.above) { $dd.addClass('dropdown-context-up').css({ top: e.pageY - 20 - $('#dropdown-' + id).height(), left: e.pageX - 13 }).fadeIn(options.fadeSpeed); } else if (typeof options.above == 'string' && options.above == 'auto') { $dd.removeClass('dropdown-context-up'); var autoH = $dd.height() + 12; if ((e.pageY + autoH) > $('html').height()) { $dd.addClass('dropdown-context-up').css({ top: e.pageY - 20 - autoH, left: e.pageX - 13 }).fadeIn(options.fadeSpeed); } else { $dd.css({ top: e.pageY + 10, left: e.pageX - 13 }).fadeIn(options.fadeSpeed); } } if (typeof options.left == 'boolean' && options.left) { $dd.addClass('dropdown-context-left').css({ left: e.pageX - $dd.width() }).fadeIn(options.fadeSpeed); } else if (typeof options.left == 'string' && options.left == 'auto') { $dd.removeClass('dropdown-context-left'); var autoL = $dd.width() - 12; if ((e.pageX + autoL) > $('html').width()) { $dd.addClass('dropdown-context-left').css({ left: e.pageX - $dd.width() + 13 }); } } }); } function destroyContext(selector) { $(document).off('contextmenu', selector).off('click', '.context-event'); } return { init: initialize, settings: updateOptions, attach: addContext, destroy: destroyContext }; })(); var createCallback = function (func) { return function (event) { func(event, currentContextSelector,rightClickEvent) }; }; var currentContextSelector = undefined; var rightClickEvent = undefined; /*! Copyright (c) 2011 Piotr Rochala (http://rocha.la) * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. * * Version: 1.3.8 * */ (function($) { $.fn.extend({ slimScroll: function(options) { var defaults = { // width in pixels of the visible scroll area width : 'auto', // height in pixels of the visible scroll area height : '250px', // width in pixels of the scrollbar and rail size : '7px', // scrollbar color, accepts any hex/color value color: '#000', // scrollbar position - left/right position : 'right', // distance in pixels between the side edge and the scrollbar distance : '1px', // default scroll position on load - top / bottom / $('selector') start : 'top', // sets scrollbar opacity opacity : .4, // enables always-on mode for the scrollbar alwaysVisible : false, // check if we should hide the scrollbar when user is hovering over disableFadeOut : false, // sets visibility of the rail railVisible : false, // sets rail color railColor : '#333', // sets rail opacity railOpacity : .2, // whether we should use jQuery UI Draggable to enable bar dragging railDraggable : true, // defautlt CSS class of the slimscroll rail railClass : 'slimScrollRail', // defautlt CSS class of the slimscroll bar barClass : 'slimScrollBar', // defautlt CSS class of the slimscroll wrapper wrapperClass : 'slimScrollDiv', // check if mousewheel should scroll the window if we reach top/bottom allowPageScroll : false, // scroll amount applied to each mouse wheel step wheelStep : 20, // scroll amount applied when user is using gestures touchScrollStep : 200, // sets border radius borderRadius: '7px', // sets border radius of the rail railBorderRadius : '7px' }; var o = $.extend(defaults, options); // do it for every element that matches selector this.each(function(){ var isOverPanel, isOverBar, isDragg, queueHide, touchDif, barHeight, percentScroll, lastScroll, divS = '
    ', minBarHeight = 30, releaseScroll = false; // used in event handlers and for better minification var me = $(this); // ensure we are not binding it again if (me.parent().hasClass(o.wrapperClass)) { // start from last bar position var offset = me.scrollTop(); // find bar and rail bar = me.siblings('.' + o.barClass); rail = me.siblings('.' + o.railClass); getBarHeight(); // check if we should scroll existing instance if ($.isPlainObject(options)) { // Pass height: auto to an existing slimscroll object to force a resize after contents have changed if ( 'height' in options && options.height == 'auto' ) { me.parent().css('height', 'auto'); me.css('height', 'auto'); var height = me.parent().parent().height(); me.parent().css('height', height); me.css('height', height); } else if ('height' in options) { var h = options.height; me.parent().css('height', h); me.css('height', h); } if ('scrollTo' in options) { // jump to a static point offset = parseInt(o.scrollTo); } else if ('scrollBy' in options) { // jump by value pixels offset += parseInt(o.scrollBy); } else if ('destroy' in options) { // remove slimscroll elements bar.remove(); rail.remove(); me.unwrap(); return; } // scroll content by the given offset scrollContent(offset, false, true); } return; } else if ($.isPlainObject(options)) { if ('destroy' in options) { return; } } // optionally set height to the parent's height o.height = (o.height == 'auto') ? me.parent().height() : o.height; // wrap content var wrapper = $(divS) .addClass(o.wrapperClass) .css({ position: 'relative', overflow: 'hidden', width: o.width, height: o.height }); // update style for the div me.css({ overflow: 'hidden', width: o.width, height: o.height }); // create scrollbar rail var rail = $(divS) .addClass(o.railClass) .css({ width: o.size, height: '100%', position: 'absolute', top: 0, display: (o.alwaysVisible && o.railVisible) ? 'block' : 'none', 'border-radius': o.railBorderRadius, background: o.railColor, opacity: o.railOpacity, zIndex: 90 }); // create scrollbar var bar = $(divS) .addClass(o.barClass) .css({ background: o.color, width: o.size, position: 'absolute', top: 0, opacity: o.opacity, display: o.alwaysVisible ? 'block' : 'none', 'border-radius' : o.borderRadius, BorderRadius: o.borderRadius, MozBorderRadius: o.borderRadius, WebkitBorderRadius: o.borderRadius, zIndex: 99 }); // set position var posCss = (o.position == 'right') ? { right: o.distance } : { left: o.distance }; rail.css(posCss); bar.css(posCss); // wrap it me.wrap(wrapper); // append to parent div me.parent().append(bar); me.parent().append(rail); // make it draggable and no longer dependent on the jqueryUI if (o.railDraggable){ bar.bind("mousedown", function(e) { var $doc = $(document); isDragg = true; t = parseFloat(bar.css('top')); pageY = e.pageY; $doc.bind("mousemove.slimscroll", function(e){ currTop = t + e.pageY - pageY; bar.css('top', currTop); scrollContent(0, bar.position().top, false);// scroll content }); $doc.bind("mouseup.slimscroll", function(e) { isDragg = false;hideBar(); $doc.unbind('.slimscroll'); }); return false; }).bind("selectstart.slimscroll", function(e){ e.stopPropagation(); e.preventDefault(); return false; }); } // on rail over rail.hover(function(){ showBar(); }, function(){ hideBar(); }); // on bar over bar.hover(function(){ isOverBar = true; }, function(){ isOverBar = false; }); // show on parent mouseover me.hover(function(){ isOverPanel = true; showBar(); hideBar(); }, function(){ isOverPanel = false; hideBar(); }); // support for mobile me.bind('touchstart', function(e,b){ if (e.originalEvent.touches.length) { // record where touch started touchDif = e.originalEvent.touches[0].pageY; } }); me.bind('touchmove', function(e){ // prevent scrolling the page if necessary if(!releaseScroll) { e.originalEvent.preventDefault(); } if (e.originalEvent.touches.length) { // see how far user swiped var diff = (touchDif - e.originalEvent.touches[0].pageY) / o.touchScrollStep; // scroll content scrollContent(diff, true); touchDif = e.originalEvent.touches[0].pageY; } }); // set up initial height getBarHeight(); // check start position if (o.start === 'bottom') { // scroll content to bottom bar.css({ top: me.outerHeight() - bar.outerHeight() }); scrollContent(0, true); } else if (o.start !== 'top') { // assume jQuery selector scrollContent($(o.start).position().top, null, true); // make sure bar stays hidden if (!o.alwaysVisible) { bar.hide(); } } // attach scroll events attachWheel(this); function _onWheel(e) { // use mouse wheel only when mouse is over if (!isOverPanel) { return; } var e = e || window.event; var delta = 0; if (e.wheelDelta) { delta = -e.wheelDelta/120; } if (e.detail) { delta = e.detail / 3; } var target = e.target || e.srcTarget || e.srcElement; if ($(target).closest('.' + o.wrapperClass).is(me.parent())) { // scroll content scrollContent(delta, true); } // stop window scroll if (e.preventDefault && !releaseScroll) { e.preventDefault(); } if (!releaseScroll) { e.returnValue = false; } } function scrollContent(y, isWheel, isJump) { releaseScroll = false; var delta = y; var maxTop = me.outerHeight() - bar.outerHeight(); if (isWheel) { // move bar with mouse wheel delta = parseInt(bar.css('top')) + y * parseInt(o.wheelStep) / 100 * bar.outerHeight(); // move bar, make sure it doesn't go out delta = Math.min(Math.max(delta, 0), maxTop); // if scrolling down, make sure a fractional change to the // scroll position isn't rounded away when the scrollbar's CSS is set // this flooring of delta would happened automatically when // bar.css is set below, but we floor here for clarity delta = (y > 0) ? Math.ceil(delta) : Math.floor(delta); // scroll the scrollbar bar.css({ top: delta + 'px' }); } // calculate actual scroll amount percentScroll = parseInt(bar.css('top')) / (me.outerHeight() - bar.outerHeight()); delta = percentScroll * (me[0].scrollHeight - me.outerHeight()); if (isJump) { delta = y; var offsetTop = delta / me[0].scrollHeight * me.outerHeight(); offsetTop = Math.min(Math.max(offsetTop, 0), maxTop); bar.css({ top: offsetTop + 'px' }); } // scroll content me.scrollTop(delta); // fire scrolling event me.trigger('slimscrolling', ~~delta); // ensure bar is visible showBar(); // trigger hide when scroll is stopped hideBar(); } function attachWheel(target) { if (window.addEventListener) { target.addEventListener('DOMMouseScroll', _onWheel, false ); target.addEventListener('mousewheel', _onWheel, false ); } else { document.attachEvent("onmousewheel", _onWheel) } } function getBarHeight() { // calculate scrollbar height and make sure it is not too small barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight); bar.css({ height: barHeight + 'px' }); // hide scrollbar if content is not long enough var display = barHeight == me.outerHeight() ? 'none' : 'block'; bar.css({ display: display }); } function showBar() { // recalculate bar height getBarHeight(); clearTimeout(queueHide); // when bar reached top or bottom if (percentScroll == ~~percentScroll) { //release wheel releaseScroll = o.allowPageScroll; // publish approporiate event if (lastScroll != percentScroll) { var msg = (~~percentScroll == 0) ? 'top' : 'bottom'; me.trigger('slimscroll', msg); } } else { releaseScroll = false; } lastScroll = percentScroll; // show only when required if(barHeight >= me.outerHeight()) { //allow window scroll releaseScroll = true; return; } bar.stop(true,true).fadeIn('fast'); if (o.railVisible) { rail.stop(true,true).fadeIn('fast'); } } function hideBar() { // only hide when options allow it if (!o.alwaysVisible) { queueHide = setTimeout(function(){ if (!(o.disableFadeOut && isOverPanel) && !isOverBar && !isDragg) { bar.fadeOut('slow'); rail.fadeOut('slow'); } }, 1000); } } }); // maintain chainability return this; } }); $.fn.extend({ slimscroll: $.fn.slimScroll }); })(jQuery); //保存页面id的field var pageIdField = "data-pageId"; function getPageId(element) { if (element instanceof jQuery) { return element.attr(pageIdField); } else { return $(element).attr(pageIdField); } } function findTabTitle(pageId) { var $ele = null; $(".page-tabs-content").find("a.menu_tab").each(function () { var $a = $(this); if ($a.attr(pageIdField) == pageId) { $ele = $a; return false;//退出循环 } }); return $ele; } function findTabPanel(pageId) { var $ele = null; $("#tab-content").find("div.tab-pane").each(function () { var $div = $(this); if ($div.attr(pageIdField) == pageId) { $ele = $div; return false;//退出循环 } }); return $ele; } function findIframeById(pageId) { return findTabPanel(pageId).children("iframe"); } function getActivePageId() { var $a = $('.page-tabs-content').find('.active'); return getPageId($a); } function canRemoveTab(pageId) { return findTabTitle(pageId).find('.fa-remove').length > 0; } //添加tab var addTabs = function (options) { var defaultTabOptions = { id: Math.random() * 200, urlType: "relative", title: "新页面" }; options = $.extend(true, defaultTabOptions, options); if (options.urlType === "relative") { // var url = window.location.protocol + '//' + window.location.host + "/"; var basePath = window.location.pathname + "/../"; options.url = basePath + options.url; } var pageId = options.id; //判断这个id的tab是否已经存在,不存在就新建一个 if (findTabPanel(pageId) === null) { //创建新TAB的title // title = ''; var $title = $('').attr(pageIdField, pageId).addClass("menu_tab"); var $text = $("").text(options.title).appendTo($title); // title += '' + options.title + ''; //是否允许关闭 if (options.close) { var $i = $("").attr(pageIdField, pageId).appendTo($title); // title += ' '; } //加入TABS $(".page-tabs-content").append($title); var $tabPanel = $('
    ').attr(pageIdField, pageId); if (options.content) { //是否指定TAB内容 $tabPanel.append(options.content); } else { //没有内容,使用IFRAME打开链接 App.blockUI({ target: '#tab-content', boxed: true, message: '加载中......'//, // animate: true }); var $iframe = $("").attr("src", options.url).css("width", "100%").attr("frameborder", "no").attr("id", "iframe_" + pageId).addClass("tab_iframe").attr(pageIdField, pageId); //frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="yes" allowtransparency="yes" //iframe 加载完成事件 //$iframe.load(function () { // App.unblockUI('#tab-content');//解锁界面 // App.fixIframeCotent();//修正高度 //}); //$().load改成$().on('load',function(){}) $iframe.on('load',function () { App.unblockUI('#tab-content');//解锁界面 App.fixIframeCotent();//修正高度 }); $tabPanel.append($iframe); } // $tab = $(content); $("#tab-content").append($tabPanel); //iframe 加载完成事件 /*$tab.find("iframe").load(function () { App.fixIframeCotent(); });*/ } activeTabByPageId(pageId); }; //关闭tab var closeTab = function (item) { //item可以是a标签,也可以是i标签 //它们都有data-id属性,获取完成之后就没事了 var pageId = getPageId(item); closeTabByPageId(pageId); }; function closeTabByPageId(pageId) { var $title = findTabTitle(pageId);//有tab的标题 var $tabPanel = findTabPanel(pageId);//装有iframe if ($title.hasClass("active")) { //要关闭的tab处于活动状态 //要把active class传递给其它tab //优先传递给后面的tab,没有的话就传递给前一个 var $nextTitle = $title.next(); var activePageId; if ($nextTitle.length > 0) { activePageId = getPageId($nextTitle); } else { activePageId = getPageId($title.prev()); } setTimeout(function () { //某种bug,需要延迟执行 activeTabByPageId(activePageId); }, 100); } else { //要关闭的tab不处于活动状态 //直接移除就可以了,不用传active class } $title.remove(); $tabPanel.remove(); // scrollToTab($('.menu_tab.active')[0]); } function closeTabOnly(pageId) { var $title = findTabTitle(pageId);//有tab的标题 var $tabPanel = findTabPanel(pageId);//装有iframe $title.remove(); $tabPanel.remove(); } var closeCurrentTab = function () { var pageId = getActivePageId(); if (canRemoveTab(pageId)) { closeTabByPageId(pageId); } }; function refreshTabById(pageId) { var $iframe = findIframeById(pageId); var url = $iframe.attr('src'); if (url.indexOf(top.document.domain) < 0) { $iframe.attr("src", url);// 跨域状况下,重新设置url } else { $iframe[0].contentWindow.location.reload(true);//带参数刷新 } App.blockUI({ target: '#tab-content', boxed: true, message: '加载中......'//, // animate: true }); } var refreshTab = function () { //刷新当前tab var pageId = getActivePageId(); refreshTabById(pageId); }; function getTabUrlById(pageId) { var $iframe = findIframeById(pageId); return $iframe[0].contentWindow.location.href; } function getTabUrl(element) { var pageId = getPageId(element); getTabUrlById(pageId); } /** * 编辑tab的标题 * @param pageId * @param title */ function editTabTitle(pageId, title) { var $title = findTabTitle(pageId);//有tab的标题 var $span = $title.children("span.page_tab_title"); $span.text(title); } //计算多个jq对象的宽度和 var calSumWidth = function (element) { var width = 0; $(element).each(function () { width += $(this).outerWidth(true); }); return width; }; //滚动到指定选项卡 var scrollToTab = function (element) { //element是tab(a标签),装有标题那个 //div.content-tabs > div.page-tabs-content var marginLeftVal = calSumWidth($(element).prevAll()),//前面所有tab的总宽度 marginRightVal = calSumWidth($(element).nextAll());//后面所有tab的总宽度 //一些按钮(向左,向右滑动)的总宽度 var tabOuterWidth = calSumWidth($(".content-tabs").children().not(".menuTabs")); // tab(a标签)显示区域的总宽度 var visibleWidth = $(".content-tabs").outerWidth(true) - tabOuterWidth; //将要滚动的长度 var scrollVal = 0; if ($(".page-tabs-content").outerWidth() < visibleWidth) { //所有的tab都可以显示的情况 scrollVal = 0; } else if (marginRightVal <= (visibleWidth - $(element).outerWidth(true) - $(element).next().outerWidth(true))) { //向右滚动 //marginRightVal(后面所有tab的总宽度)小于可视区域-(当前tab和下一个tab的宽度) if ((visibleWidth - $(element).next().outerWidth(true)) > marginRightVal) { scrollVal = marginLeftVal; var tabElement = element; while ((scrollVal - $(tabElement).outerWidth()) > ($(".page-tabs-content").outerWidth() - visibleWidth)) { scrollVal -= $(tabElement).prev().outerWidth(); tabElement = $(tabElement).prev(); } } } else if (marginLeftVal > (visibleWidth - $(element).outerWidth(true) - $(element).prev().outerWidth(true))) { //向左滚动 scrollVal = marginLeftVal - $(element).prev().outerWidth(true); } //执行动画 $('.page-tabs-content').animate({ marginLeft: 0 - scrollVal + 'px' }, "fast"); }; //滚动条滚动到左边 var scrollTabLeft = function () { var marginLeftVal = Math.abs(parseInt($('.page-tabs-content').css('margin-left'))); var tabOuterWidth = calSumWidth($(".content-tabs").children().not(".menuTabs")); var visibleWidth = $(".content-tabs").outerWidth(true) - tabOuterWidth; var scrollVal = 0; if ($(".page-tabs-content").width() < visibleWidth) { return false; } else { var tabElement = $(".menu_tab:first"); var offsetVal = 0; while ((offsetVal + $(tabElement).outerWidth(true)) <= marginLeftVal) { offsetVal += $(tabElement).outerWidth(true); tabElement = $(tabElement).next(); } offsetVal = 0; if (calSumWidth($(tabElement).prevAll()) > visibleWidth) { while ((offsetVal + $(tabElement).outerWidth(true)) < (visibleWidth) && tabElement.length > 0) { offsetVal += $(tabElement).outerWidth(true); tabElement = $(tabElement).prev(); } scrollVal = calSumWidth($(tabElement).prevAll()); } } $('.page-tabs-content').animate({ marginLeft: 0 - scrollVal + 'px' }, "fast"); }; //滚动条滚动到右边 var scrollTabRight = function () { var marginLeftVal = Math.abs(parseInt($('.page-tabs-content').css('margin-left'))); var tabOuterWidth = calSumWidth($(".content-tabs").children().not(".menuTabs")); var visibleWidth = $(".content-tabs").outerWidth(true) - tabOuterWidth; var scrollVal = 0; if ($(".page-tabs-content").width() < visibleWidth) { return false; } else { var tabElement = $(".menu_tab:first"); var offsetVal = 0; while ((offsetVal + $(tabElement).outerWidth(true)) <= marginLeftVal) { offsetVal += $(tabElement).outerWidth(true); tabElement = $(tabElement).next(); } offsetVal = 0; while ((offsetVal + $(tabElement).outerWidth(true)) < (visibleWidth) && tabElement.length > 0) { offsetVal += $(tabElement).outerWidth(true); tabElement = $(tabElement).next(); } scrollVal = calSumWidth($(tabElement).prevAll()); if (scrollVal > 0) { $('.page-tabs-content').animate({ marginLeft: 0 - scrollVal + 'px' }, "fast"); } } }; //关闭其他选项卡 var closeOtherTabs = function (isAll) { if (isAll) { //关闭全部 $('.page-tabs-content').children("[" + pageIdField + "]").find('.fa-remove').parents('a').each(function () { var $a = $(this); var pageId = getPageId($a); closeTabOnly(pageId); // closeTab($a); /*$('#' + $(this).data('id')).remove(); $(this).remove();*/ }); var firstChild = $(".page-tabs-content").children().eq(0); //选中那些删不掉的第一个菜单 if (firstChild) { //激活这个选项卡 activeTabByPageId(getPageId(firstChild)); /*$('#' + firstChild.data('id')).addClass('active'); firstChild.addClass('active');*/ } } else { //除此之外全部删除 $('.page-tabs-content').children("[" + pageIdField + "]").find('.fa-remove').parents('a').not(".active").each(function () { var $a = $(this); var pageId = getPageId($a); closeTabOnly(pageId); // closeTab($a); /*$('#' + $(this).data('id')).remove(); $(this).remove();*/ }); } }; //激活Tab,通过id function activeTabByPageId(pageId) { $(".menu_tab").removeClass("active"); $("#tab-content").find(".active").removeClass("active"); //激活TAB var $title = findTabTitle(pageId).addClass('active'); findTabPanel(pageId).addClass("active"); // scrollToTab($('.menu_tab.active')); scrollToTab($title[0]); } $(function () { var $tabs = $(".menuTabs"); //点击选项卡的时候就激活tab $tabs.on("click", ".menu_tab", function () { var pageId = getPageId(this); activeTabByPageId(pageId); }); //双击选项卡刷新页面 $tabs.on("dblclick", ".menu_tab", function () { // console.log("dbclick"); var pageId = getPageId(this); refreshTabById(pageId); }); //选项卡右键菜单 function findTabElement(target) { var $ele = $(target); if (!$ele.is("a")) { $ele = $ele.parents("a.menu_tab"); } return $ele; } context.init({ preventDoubleContext: false,//不禁用原始右键菜单 compress: true//元素更少的padding }); context.attach('.page-tabs-content', [ // {header: 'Options'}, { text: '刷新', action: function (e, $selector, rightClickEvent) { //e是点击菜单的事件 //$selector就是$(".page-tabs-content") //rightClickEvent就是右键打开菜单的事件 var pageId = getPageId(findTabElement(rightClickEvent.target)); refreshTabById(pageId); } }, { text: "在新窗口打开", action: function (e, $selector, rightClickEvent) { var pageId = getPageId(findTabElement(rightClickEvent.target)); var url = getTabUrlById(pageId); window.open(url); } } // {text: 'Open in new Window', href: '#'}, // {divider: true}, // {text: 'Copy', href: '#'}, // {text: 'Dafuq!?', href: '#'} ]); }); /*! * jQuery blockUI plugin * Version 2.70.0-2014.11.23 * Requires jQuery v1.7 or later * * Examples at: http://malsup.com/jquery/block/ * Copyright (c) 2007-2013 M. Alsup * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * * Thanks to Amir-Hossein Sobhi for some excellent contributions! */ !function(){"use strict";function e(e){function t(t,n){var s,h,k=t==window,y=n&&void 0!==n.message?n.message:void 0;if(n=e.extend({},e.blockUI.defaults,n||{}),!n.ignoreIfBlocked||!e(t).data("blockUI.isBlocked")){if(n.overlayCSS=e.extend({},e.blockUI.defaults.overlayCSS,n.overlayCSS||{}),s=e.extend({},e.blockUI.defaults.css,n.css||{}),n.onOverlayClick&&(n.overlayCSS.cursor="pointer"),h=e.extend({},e.blockUI.defaults.themedCSS,n.themedCSS||{}),y=void 0===y?n.message:y,k&&p&&o(window,{fadeOut:0}),y&&"string"!=typeof y&&(y.parentNode||y.jquery)){var m=y.jquery?y[0]:y,v={};e(t).data("blockUI.history",v),v.el=m,v.parent=m.parentNode,v.display=m.style.display,v.position=m.style.position,v.parent&&v.parent.removeChild(m)}e(t).data("blockUI.onUnblock",n.onUnblock);var g,I,w,U,x=n.baseZ;g=e(r||n.forceIframe?'':''),I=e(n.theme?'':''),n.theme&&k?(U='"):n.theme?(U='"):U=k?'':'',w=e(U),y&&(n.theme?(w.css(h),w.addClass("ui-widget-content")):w.css(s)),n.theme||I.css(n.overlayCSS),I.css("position",k?"fixed":"absolute"),(r||n.forceIframe)&&g.css("opacity",0);var C=[g,I,w],S=e(k?"body":t);e.each(C,function(){this.appendTo(S)}),n.theme&&n.draggable&&e.fn.draggable&&w.draggable({handle:".ui-dialog-titlebar",cancel:"li"});var O=f&&(!e.support.boxModel||e("object,embed",k?null:t).length>0);if(u||O){if(k&&n.allowBodyStretch&&e.support.boxModel&&e("html,body").css("height","100%"),(u||!e.support.boxModel)&&!k)var E=d(t,"borderTopWidth"),T=d(t,"borderLeftWidth"),M=E?"(0 - "+E+")":0,B=T?"(0 - "+T+")":0;e.each(C,function(e,t){var o=t[0].style;if(o.position="absolute",2>e)k?o.setExpression("height","Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:"+n.quirksmodeOffsetHack+') + "px"'):o.setExpression("height",'this.parentNode.offsetHeight + "px"'),k?o.setExpression("width",'jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"'):o.setExpression("width",'this.parentNode.offsetWidth + "px"'),B&&o.setExpression("left",B),M&&o.setExpression("top",M);else if(n.centerY)k&&o.setExpression("top",'(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"'),o.marginTop=0;else if(!n.centerY&&k){var i=n.css&&n.css.top?parseInt(n.css.top,10):0,s="((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "+i+') + "px"';o.setExpression("top",s)}})}if(y&&(n.theme?w.find(".ui-widget-content").append(y):w.append(y),(y.jquery||y.nodeType)&&e(y).show()),(r||n.forceIframe)&&n.showOverlay&&g.show(),n.fadeIn){var j=n.onBlock?n.onBlock:c,H=n.showOverlay&&!y?j:c,z=y?j:c;n.showOverlay&&I._fadeIn(n.fadeIn,H),y&&w._fadeIn(n.fadeIn,z)}else n.showOverlay&&I.show(),y&&w.show(),n.onBlock&&n.onBlock.bind(w)();if(i(1,t,n),k?(p=w[0],b=e(n.focusableElements,p),n.focusInput&&setTimeout(l,20)):a(w[0],n.centerX,n.centerY),n.timeout){var W=setTimeout(function(){k?e.unblockUI(n):e(t).unblock(n)},n.timeout);e(t).data("blockUI.timeout",W)}}}function o(t,o){var s,l=t==window,a=e(t),d=a.data("blockUI.history"),c=a.data("blockUI.timeout");c&&(clearTimeout(c),a.removeData("blockUI.timeout")),o=e.extend({},e.blockUI.defaults,o||{}),i(0,t,o),null===o.onUnblock&&(o.onUnblock=a.data("blockUI.onUnblock"),a.removeData("blockUI.onUnblock"));var r;r=l?e("body").children().filter(".blockUI").add("body > .blockUI"):a.find(">.blockUI"),o.cursorReset&&(r.length>1&&(r[1].style.cursor=o.cursorReset),r.length>2&&(r[2].style.cursor=o.cursorReset)),l&&(p=b=null),o.fadeOut?(s=r.length,r.stop().fadeOut(o.fadeOut,function(){0===--s&&n(r,d,o,t)})):n(r,d,o,t)}function n(t,o,n,i){var s=e(i);if(!s.data("blockUI.isBlocked")){t.each(function(){this.parentNode&&this.parentNode.removeChild(this)}),o&&o.el&&(o.el.style.display=o.display,o.el.style.position=o.position,o.el.style.cursor="default",o.parent&&o.parent.appendChild(o.el),s.removeData("blockUI.history")),s.data("blockUI.static")&&s.css("position","static"),"function"==typeof n.onUnblock&&n.onUnblock(i,n);var l=e(document.body),a=l.width(),d=l[0].style.width;l.width(a-1).width(a),l[0].style.width=d}}function i(t,o,n){var i=o==window,l=e(o);if((t||(!i||p)&&(i||l.data("blockUI.isBlocked")))&&(l.data("blockUI.isBlocked",t),i&&n.bindEvents&&(!t||n.showOverlay))){var a="mousedown mouseup keydown keypress keyup touchstart touchend touchmove";t?e(document).bind(a,n,s):e(document).unbind(a,s)}}function s(t){if("keydown"===t.type&&t.keyCode&&9==t.keyCode&&p&&t.data.constrainTabKey){var o=b,n=!t.shiftKey&&t.target===o[o.length-1],i=t.shiftKey&&t.target===o[0];if(n||i)return setTimeout(function(){l(i)},10),!1}var s=t.data,a=e(t.target);return a.hasClass("blockOverlay")&&s.onOverlayClick&&s.onOverlayClick(t),a.parents("div."+s.blockMsgClass).length>0?!0:0===a.parents().children().filter("div.blockUI").length}function l(e){if(b){var t=b[e===!0?b.length-1:0];t&&t.focus()}}function a(e,t,o){var n=e.parentNode,i=e.style,s=(n.offsetWidth-e.offsetWidth)/2-d(n,"borderLeftWidth"),l=(n.offsetHeight-e.offsetHeight)/2-d(n,"borderTopWidth");t&&(i.left=s>0?s+"px":"0"),o&&(i.top=l>0?l+"px":"0")}function d(t,o){return parseInt(e.css(t,o),10)||0}e.fn._fadeIn=e.fn.fadeIn;var c=e.noop||function(){},r=/MSIE/.test(navigator.userAgent),u=/MSIE 6.0/.test(navigator.userAgent)&&!/MSIE 8.0/.test(navigator.userAgent),f=(document.documentMode||0,e.isFunction(document.createElement("div").style.setExpression));e.blockUI=function(e){t(window,e)},e.unblockUI=function(e){o(window,e)},e.growlUI=function(t,o,n,i){var s=e('
    ');t&&s.append("

    "+t+"

    "),o&&s.append("

    "+o+"

    "),void 0===n&&(n=3e3);var l=function(t){t=t||{},e.blockUI({message:s,fadeIn:"undefined"!=typeof t.fadeIn?t.fadeIn:700,fadeOut:"undefined"!=typeof t.fadeOut?t.fadeOut:1e3,timeout:"undefined"!=typeof t.timeout?t.timeout:n,centerY:!1,showOverlay:!1,onUnblock:i,css:e.blockUI.defaults.growlCSS})};l();s.css("opacity");s.mouseover(function(){l({fadeIn:0,timeout:3e4});var t=e(".blockMsg");t.stop(),t.fadeTo(300,1)}).mouseout(function(){e(".blockMsg").fadeOut(1e3)})},e.fn.block=function(o){if(this[0]===window)return e.blockUI(o),this;var n=e.extend({},e.blockUI.defaults,o||{});return this.each(function(){var t=e(this);n.ignoreIfBlocked&&t.data("blockUI.isBlocked")||t.unblock({fadeOut:0})}),this.each(function(){"static"==e.css(this,"position")&&(this.style.position="relative",e(this).data("blockUI.static",!0)),this.style.zoom=1,t(this,o)})},e.fn.unblock=function(t){return this[0]===window?(e.unblockUI(t),this):this.each(function(){o(this,t)})},e.blockUI.version=2.7,e.blockUI.defaults={message:"

    Please wait...

    ",title:null,draggable:!0,theme:!1,css:{padding:0,margin:0,width:"30%",top:"40%",left:"35%",textAlign:"center",color:"#000",border:"3px solid #aaa",backgroundColor:"#fff",cursor:"wait"},themedCSS:{width:"30%",top:"40%",left:"35%"},overlayCSS:{backgroundColor:"#000",opacity:.6,cursor:"wait"},cursorReset:"default",growlCSS:{width:"350px",top:"10px",left:"",right:"10px",border:"none",padding:"5px",opacity:.6,cursor:"default",color:"#fff",backgroundColor:"#000","-webkit-border-radius":"10px","-moz-border-radius":"10px","border-radius":"10px"},iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank",forceIframe:!1,baseZ:1e3,centerX:!0,centerY:!0,allowBodyStretch:!0,bindEvents:!0,constrainTabKey:!0,fadeIn:200,fadeOut:400,timeout:0,showOverlay:!0,focusInput:!0,focusableElements:":input:enabled:visible",onBlock:null,onUnblock:null,onOverlayClick:null,quirksmodeOffsetHack:4,blockMsgClass:"blockMsg",ignoreIfBlocked:!1};var p=null,b=[]}"function"==typeof define&&define.amd&&define.amd.jQuery?define(["jquery"],e):e(jQuery)}(); (function ($) { $.fn.sidebarMenu = function (options) { options = $.extend({}, $.fn.sidebarMenu.defaults, options || {}); var $menu_ul = $(this); var level = 0; // target.addClass('nav'); // target.addClass('nav-list'); if (options.data) { init($menu_ul, options.data, level); } else { if (!options.url) return; $.getJSON(options.url, options.param, function (data) { init($menu_ul, data, level); }); } function init($menu_ul, data, level) { $.each(data, function (i, item) { //如果标签是isHeader var $header = $('
  • '); if (item.isHeader !== null && item.isHeader === true) { $header.append(item.text); $menu_ul.append($header); return; } //如果不是header //var li = $('
  • '); var li = $('
  • '); //a标签 var $a; if (level > 0) { //$a = $(''); $a = $(''); } else { $a = $(''); } //图标 var $icon = $(''); $icon.addClass(item.icon); //标题 var $title = $(''); $title.addClass('menu-text').text(item.text); $a.append($icon); $a.append($title); $a.addClass("nav-link"); var isOpen = item.isOpen; if (isOpen === true) { li.addClass("active"); } if (item.children && item.children.length > 0) { var pullSpan = $(''); var pullIcon = $(''); pullSpan.append(pullIcon); $a.append(pullSpan); li.append($a); var menus = $(''); menus.addClass('treeview-menu'); if (isOpen === true) { menus.css("display", "block"); menus.addClass("menu-open"); } else { menus.css("display", "none"); } init(menus, item.children, level + 1); li.append(menus); } else { if (item.targetType != null && item.targetType === "blank") //代表打开新页面 { $a.attr("href", item.url); $a.attr("target", "_blank"); } else if (item.targetType != null && item.targetType === "ajax") { //代表ajax方式打开页面 $a.attr("href", item.url); $a.addClass("ajaxify"); } else if (item.targetType != null && item.targetType === "iframe-tab") { item.urlType = item.urlType ? item.urlType : 'relative'; var href = 'addTabs({id:\'' + item.id + '\',title: \'' + item.text + '\',close: true,url: \'' + item.url + '\',urlType: \'' + item.urlType + '\'});'; $a.attr('onclick', href); } else if (item.targetType != null && item.targetType === "iframe") { //代表单iframe页面 $a.attr("href", item.url); $a.addClass("iframeOpen"); $("#iframe-main").addClass("tab_iframe"); } else { $a.attr("href", item.url); $a.addClass("iframeOpen"); $("#iframe-main").addClass("tab_iframe"); } $a.addClass("nav-link"); var badge = $(""); // 1 //comment by xue lei if (item.tip != null && item.tip > 0) { badge.addClass("label").addClass("label-success").text(item.tip); } $a.append(badge); li.append($a); } $menu_ul.append(li); }); } //另外绑定菜单被点击事件,做其它动作 $menu_ul.on("click", "li.treeview a", function () { var $a = $(this); if ($a.next().length == 0) {//如果size>0,就认为它是可以展开的 //if ($(window).width() < $.AdminLTE.options.screenSizes.sm) {//小屏幕 // //触发左边菜单栏按钮点击事件,关闭菜单栏 // $($.AdminLTE.options.sidebarToggleSelector).click(); //} } }); }; $.fn.sidebarMenu.defaults = { url: null, param: null, data: null, isHeader: false }; })(jQuery); //sidebar - menu组件封装 //在页面上面直接调用sidebar - menu的方法