📄 ui.tabs.js
字号:
// Prevent IE from keeping other link focussed when using the back button // and remove dotted border from clicked link. This is controlled in modern // browsers via CSS, also blur removes focus from address bar in Firefox // which can become a usability and annoying problem with tabsRotate. if ($.browser.msie) this.blur(); //return o.bookmarkable && !!trueClick; // convert trueClick == undefined to Boolean required in IE return false; }); // disable click if event is configured to something else if (!(/^click/).test(o.event)) this.$tabs.bind('click.tabs', function() { return false; }); }, add: function(url, label, index) { if (index == undefined) index = this.$tabs.length; // append by default var o = this.options; var $li = $(o.tabTemplate.replace(/#\{href\}/g, url).replace(/#\{label\}/g, label)); $li.data('destroy.tabs', true); var id = url.indexOf('#') == 0 ? url.replace('#', '') : this.tabId( $('a:first-child', $li)[0] ); // try to find an existing element before creating a new one var $panel = $('#' + id); if (!$panel.length) { $panel = $(o.panelTemplate).attr('id', id) .addClass(o.hideClass) .data('destroy.tabs', true); } $panel.addClass(o.panelClass); if (index >= this.$lis.length) { $li.appendTo(this.element); $panel.appendTo(this.element[0].parentNode); } else { $li.insertBefore(this.$lis[index]); $panel.insertBefore(this.$panels[index]); } o.disabled = $.map(o.disabled, function(n, i) { return n >= index ? ++n : n }); this.tabify(); if (this.$tabs.length == 1) { $li.addClass(o.selectedClass); $panel.removeClass(o.hideClass); var href = $.data(this.$tabs[0], 'load.tabs'); if (href) this.load(index, href); } // callback this.element.triggerHandler('tabsadd', [null, this.ui(this.$tabs[index], this.$panels[index])], o.add ); }, remove: function(index) { var o = this.options, $li = this.$lis.eq(index).remove(), $panel = this.$panels.eq(index).remove(); // If selected tab was removed focus tab to the right or // in case the last tab was removed the tab to the left. if ($li.hasClass(o.selectedClass) && this.$tabs.length > 1) this.select(index + (index + 1 < this.$tabs.length ? 1 : -1)); o.disabled = $.map($.grep(o.disabled, function(n, i) { return n != index; }), function(n, i) { return n >= index ? --n : n }); this.tabify(); // callback this.element.triggerHandler('tabsremove', [null, this.ui($li.find('a')[0], $panel[0])], o.remove ); }, enable: function(index) { var o = this.options; if ($.inArray(index, o.disabled) == -1) return; var $li = this.$lis.eq(index).removeClass(o.disabledClass); if ($.browser.safari) { // fix disappearing tab (that used opacity indicating disabling) after enabling in Safari 2... $li.css('display', 'inline-block'); setTimeout(function() { $li.css('display', 'block'); }, 0); } o.disabled = $.grep(o.disabled, function(n, i) { return n != index; }); // callback this.element.triggerHandler('tabsenable', [null, this.ui(this.$tabs[index], this.$panels[index])], o.enable ); }, disable: function(index) { var self = this, o = this.options; if (index != o.selected) { // cannot disable already selected tab this.$lis.eq(index).addClass(o.disabledClass); o.disabled.push(index); o.disabled.sort(); // callback this.element.triggerHandler('tabsdisable', [null, this.ui(this.$tabs[index], this.$panels[index])], o.disable ); } }, select: function(index) { if (typeof index == 'string') index = this.$tabs.index( this.$tabs.filter('[href$=' + index + ']')[0] ); this.$tabs.eq(index).trigger(this.options.event); }, load: function(index, callback) { // callback is for internal usage only var self = this, o = this.options, $a = this.$tabs.eq(index), a = $a[0], bypassCache = callback == undefined || callback === false, url = $a.data('load.tabs'); callback = callback || function() {}; // no remote or from cache - just finish with callback if (!url || !bypassCache && $.data(a, 'cache.tabs')) { callback(); return; } // load remote from here on var inner = function(parent) { var $parent = $(parent), $inner = $parent.find('*:last'); return $inner.length && $inner || $parent; }; var cleanup = function() { self.$tabs.filter('.' + o.loadingClass).removeClass(o.loadingClass) .each(function() { if (o.spinner) inner(this).parent().html(inner(this).data('label.tabs')); }); self.xhr = null; }; if (o.spinner) { var label = inner(a).html(); inner(a).wrapInner('<em></em>') .find('em').data('label.tabs', label).html(o.spinner); } var ajaxOptions = $.extend({}, o.ajaxOptions, { url: url, success: function(r, s) { $(a.hash).html(r); cleanup(); if (o.cache) $.data(a, 'cache.tabs', true); // if loaded once do not load them again // callbacks $(self.element).triggerHandler('tabsload', [null, self.ui(self.$tabs[index], self.$panels[index])], o.load ); o.ajaxOptions.success && o.ajaxOptions.success(r, s); // This callback is required because the switch has to take // place after loading has completed. Call last in order to // fire load before show callback... callback(); } }); if (this.xhr) { // terminate pending requests from other tabs and restore tab label this.xhr.abort(); cleanup(); } $a.addClass(o.loadingClass); setTimeout(function() { // timeout is again required in IE, "wait" for id being restored self.xhr = $.ajax(ajaxOptions); }, 0); }, url: function(index, url) { this.$tabs.eq(index).removeData('cache.tabs').data('load.tabs', url); }, destroy: function() { var o = this.options; this.element.unbind('.tabs') .removeClass(o.navClass).removeData('tabs'); this.$tabs.each(function() { var href = $.data(this, 'href.tabs'); if (href) this.href = href; var $this = $(this).unbind('.tabs'); $.each(['href', 'load', 'cache'], function(i, prefix) { $this.removeData(prefix + '.tabs'); }); }); this.$lis.add(this.$panels).each(function() { if ($.data(this, 'destroy.tabs')) $(this).remove(); else $(this).removeClass([o.selectedClass, o.unselectClass, o.disabledClass, o.panelClass, o.hideClass].join(' ')); }); }});$.ui.tabs.defaults = { // basic setup unselect: false, event: 'click', disabled: [], cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true } // TODO history: false, // Ajax spinner: 'Loading…', cache: false, idPrefix: 'ui-tabs-', ajaxOptions: {}, // animations fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 } // templates tabTemplate: '<li><a href="#{href}"><span>#{label}</span></a></li>', panelTemplate: '<div></div>', // CSS classes navClass: 'ui-tabs-nav', selectedClass: 'ui-tabs-selected', unselectClass: 'ui-tabs-unselect', disabledClass: 'ui-tabs-disabled', panelClass: 'ui-tabs-panel', hideClass: 'ui-tabs-hide', loadingClass: 'ui-tabs-loading'};$.ui.tabs.getter = "length";/* * Tabs Extensions *//* * Rotate */$.extend($.ui.tabs.prototype, { rotation: null, rotate: function(ms, continuing) { continuing = continuing || false; var self = this, t = this.options.selected; function start() { self.rotation = setInterval(function() { t = ++t < self.$tabs.length ? t : 0; self.select(t); }, ms); } function stop(e) { if (!e || e.clientX) { // only in case of a true click clearInterval(self.rotation); } } // start interval if (ms) { start(); if (!continuing) this.$tabs.bind(this.options.event, stop); else this.$tabs.bind(this.options.event, function() { stop(); t = self.options.selected; start(); }); } // stop interval else { stop(); this.$tabs.unbind(this.options.event, stop); } }});})(jQuery);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -