123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- /**
- * http://git.oschina.net/hbbcs/bootStrap-addTabs
- * Created by joe on 2015-12-19.
- * Modified by Karson
- */
- (function ($) {
- $.fn.addtabs = function (options) {
- var obj = $(this);
- options = $.extend({
- content: '', //直接指定所有页面TABS内容
- close: true, //是否可以关闭
- monitor: 'body', //监视的区域
- nav: '.nav-addtabs',
- tab: '.tab-addtabs',
- iframeUse: true, //使用iframe还是ajax
- iframeHeight: $(window).height() - 50, //固定TAB中IFRAME高度,根据需要自己修改
- iframeForceRefresh: false, //点击后强制加载对应的iframe
- iframeForceRefreshTable: false, //点击后强制刷新对应的iframe中的table
- callback: function () {
- //关闭后回调函数
- }
- }, options || {});
- var navobj = $(options.nav);
- var tabobj = $(options.tab);
- if (history.pushState) {
- //浏览器前进后退事件
- $(window).on("popstate", function (e) {
- var state = e.originalEvent.state;
- if (state) {
- $("a[addtabs=" + state.id + "]", options.monitor).data("pushstate", true).trigger("click");
- }
- });
- }
- $(options.monitor).on('click', '[addtabs]', function (e) {
- if ($(this).attr('url').indexOf("javascript:") !== 0) {
- if ($(this).is("a")) {
- e.preventDefault();
- }
- var id = $(this).attr('addtabs');
- var title = $(this).attr('title') ? $(this).attr('title') : $.trim($(this).text());
- var url = $(this).attr('url');
- var content = options.content ? options.content : $(this).attr('content');
- var ajax = $(this).attr('ajax') === '1' || $(this).attr('ajax') === 'true';
- var state = ({
- url: url, title: title, id: id, content: content, ajax: ajax
- });
- document.title = title;
- if (history.pushState && !$(this).data("pushstate")) {
- var pushurl = url.indexOf("ref=addtabs") === -1 ? (url + (url.indexOf("?") > -1 ? "&" : "?") + "ref=addtabs") : url;
- try {
- window.history.pushState(state, title, pushurl);
- } catch (e) {
- }
- }
- $(this).data("pushstate", null);
- _add.call(this, {
- id: id,
- title: $(this).attr('title') ? $(this).attr('title') : $(this).html(),
- content: content,
- url: url,
- ajax: ajax
- });
- }
- });
- navobj.on('click', '.close-tab', function () {
- var id = $(this).prev("a").attr("aria-controls");
- _close(id);
- return false;
- });
- navobj.on('dblclick', 'li[role=presentation]', function () {
- $(this).find(".close-tab").trigger("click");
- });
- navobj.on('click', 'li[role=presentation]', function () {
- $("a[addtabs=" + $("a", this).attr("node-id") + "]").trigger("click");
- });
- $(window).resize(function () {
- if (typeof options.nav === 'object') {
- var siblingsWidth = 0;
- navobj.siblings().each(function () {
- siblingsWidth += $(this).outerWidth();
- });
- navobj.width(navobj.parent().width() - siblingsWidth);
- } else {
- $("#nav").width($("#header").find("> .navbar").width() - $(".sidebar-toggle").outerWidth() - $(".navbar-custom-menu").outerWidth() - 20);
- }
- _drop();
- });
- var _add = function (opts) {
- var id, tabid, conid, url;
- id = opts.id;
- tabid = 'tab_' + opts.id;
- conid = 'con_' + opts.id;
- url = opts.url;
- url += (opts.url.indexOf("?") > -1 ? "&addtabs=1" : "?addtabs=1");
- var tabitem = $('#' + tabid, navobj);
- var conitem = $('#' + conid, tabobj);
- navobj.find("[role='presentation']").removeClass('active');
- tabobj.find("[role='tabpanel']").removeClass('active');
- //如果TAB不存在,创建一个新的TAB
- if (tabitem.size() === 0) {
- //创建新TAB的title
- tabitem = $('<li role="presentation" id="' + tabid + '"><a href="#' + conid + '" node-id="' + opts.id + '" aria-controls="' + id + '" role="tab" data-toggle="tab">' + opts.title + '</a></li>');
- //是否允许关闭
- if (options.close && $("li", navobj).size() > 0) {
- tabitem.append(' <i class="close-tab fa fa-remove"></i>');
- }
- if (conitem.size() === 0) {
- //创建新TAB的内容
- conitem = $('<div role="tabpanel" class="tab-pane" id="' + conid + '"></div>');
- //是否指定TAB内容
- if (opts.content) {
- conitem.append(opts.content);
- } else if (options.iframeUse && !opts.ajax) {//没有内容,使用IFRAME打开链接
- var height = options.iframeHeight;
- conitem.append('<iframe src="' + url + '" width="100%" height="' + height + '" frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling-x="no" scrolling-y="auto" allowtransparency="yes"></iframe></div>');
- } else {
- $.get(url, function (data) {
- conitem.append(data);
- });
- }
- tabobj.append(conitem);
- }
- //加入TABS
- if ($('.tabdrop li', navobj).size() > 0) {
- $('.tabdrop ul', navobj).append(tabitem);
- } else {
- navobj.append(tabitem);
- }
- } else {
- //强制刷新iframe
- if (options.iframeForceRefresh) {
- $("#" + conid + " iframe").attr('src', function (i, val) {
- return val;
- });
- } else if (options.iframeForceRefreshTable) {
- try {
- //检测iframe中是否存在刷新按钮
- if ($("#" + conid + " iframe").contents().find(".btn-refresh:not([data-force-refresh=false])").size() > 0) {
- $("#" + conid + " iframe")[0].contentWindow.$(".btn-refresh:not([data-force-refresh=false])").trigger("click");
- }
- } catch (e) {
- }
- }
- }
- localStorage.setItem("addtabs", $(this).prop('outerHTML'));
- //激活TAB
- tabitem.addClass('active');
- conitem.addClass("active");
- _drop();
- };
- var _close = function (id) {
- var tabid = 'tab_' + id;
- var conid = 'con_' + id;
- var tabitem = $('#' + tabid, navobj);
- var conitem = $('#' + conid, tabobj);
- //如果关闭的是当前激活的TAB,激活他的前一个TAB
- if (obj.find("li.active").not('.tabdrop').attr('id') === tabid) {
- var prev = tabitem.prev().not(".tabdrop");
- var next = tabitem.next().not(".tabdrop");
- if (prev.size() > 0) {
- prev.find('a').trigger("click");
- } else if (next.size() > 0) {
- next.find('a').trigger("click");
- } else {
- $(">li:not(.tabdrop):last > a", navobj).trigger('click');
- }
- }
- //关闭TAB
- tabitem.remove();
- conitem.remove();
- _drop();
- options.callback();
- };
- var _drop = function () {
- navobj.refreshAddtabs();
- };
- };
- //刷新Addtabs
- $.fn.refreshAddtabs = function () {
- var navobj = $(this);
- var dropdown = $(".tabdrop", navobj);
- if (dropdown.size() === 0) {
- dropdown = $('<li class="dropdown pull-right hide tabdrop"><a class="dropdown-toggle" data-toggle="dropdown" href="javascript:;">' +
- '<i class="glyphicon glyphicon-align-justify"></i>' +
- ' <b class="caret"></b></a><ul class="dropdown-menu"></ul></li>');
- dropdown.prependTo(navobj);
- }
- //检测是否有下拉样式
- if (navobj.parent().is('.tabs-below')) {
- dropdown.addClass('dropup');
- }
- var collection = 0;
- var maxwidth = navobj.width() - 65;
- var liwidth = 0;
- //检查超过一行的标签页
- var litabs = navobj.append(dropdown.find('li')).find('>li').not('.tabdrop');
- var totalwidth = 0;
- litabs.each(function () {
- totalwidth += $(this).outerWidth(true);
- });
- if (navobj.width() < totalwidth) {
- litabs.each(function () {
- liwidth += $(this).outerWidth(true);
- if (liwidth > maxwidth) {
- dropdown.find('ul').append($(this));
- collection++;
- }
- });
- if (collection > 0) {
- dropdown.removeClass('hide');
- if (dropdown.find('.active').length === 1) {
- dropdown.addClass('active');
- } else {
- dropdown.removeClass('active');
- }
- }
- } else {
- dropdown.addClass('hide');
- }
- };
- })(jQuery);
|