Dotclear

source: admin/js/jquery/jquery.pageTabs.js @ 2479:6883db18a27e

Revision 2479:6883db18a27e, 3.6 KB checked in by Nicolas <nikrou77@…>, 12 years ago (diff)

Fix issue when hash not refer to existing div content. Closes #1794
Improve the way ton find anchor related to a div content, addresses #1723

Line 
1(function($) {
2     'use strict';
3   
4     $.pageTabs = function(start_tab, opts) {
5          var defaults = {
6               containerClass: 'part-tabs',
7               partPrefix: 'part-',
8               contentClass: 'multi-part',
9               activeClass: 'part-tabs-active',
10               idTabPrefix: 'part-tabs-'
11          };
12         
13          $.pageTabs.options = $.extend({}, defaults, opts);
14          var active_tab = start_tab || '';
15          var hash = $.pageTabs.getLocationHash();
16
17          if (hash !== undefined && hash) {
18               window.scrollTo(0,0);
19               active_tab = hash;
20          } else if (active_tab == '') { // open first part
21               active_tab = $('.'+$.pageTabs.options.contentClass+':eq(0)').attr('id');
22          }
23
24          createTabs();
25         
26          $('ul li', '.'+$.pageTabs.options.containerClass).click(function(e) {
27               if ($(this).hasClass($.pageTabs.options.activeClass)) {
28                    return;
29               }
30
31               $(this).parent().find('li.'+$.pageTabs.options.activeClass).removeClass($.pageTabs.options.activeClass);
32               $(this).addClass($.pageTabs.options.activeClass);
33               $('.'+$.pageTabs.options.contentClass+'.active').removeClass('active').hide();
34
35               var part_to_activate = $('#'+$.pageTabs.options.partPrefix+getHash($(this).find('a').attr('href')));
36
37               part_to_activate.addClass('active').show();
38               if (!part_to_activate.hasClass('loaded')) {
39                    part_to_activate.onetabload();
40                    part_to_activate.addClass('loaded');
41               }
42               
43               part_to_activate.tabload();
44          });
45
46          $(window).bind('hashchange onhashchange', function(e) {
47               $.pageTabs.clickTab($.pageTabs.getLocationHash());
48          });
49
50          $.pageTabs.clickTab(active_tab);
51         
52          return this;
53     };
54     
55     var createTabs = function createTabs() {
56          var lis = [], li_class = '';
57         
58          $('.'+$.pageTabs.options.contentClass).each(function() {
59               $(this).hide();
60               lis.push('<li id="'+$.pageTabs.options.idTabPrefix+$(this).attr('id')+'">'
61                     +'<a href="#'+$(this).attr('id')+'">'+$(this).attr('title')+'</a></li>');
62               $(this).attr('id', $.pageTabs.options.partPrefix + $(this).attr('id')).prop('title','');
63          });
64         
65          $('<div class="'+$.pageTabs.options.containerClass+'"><ul>'+lis.join('')+'</ul></div>')
66               .insertBefore($('.'+$.pageTabs.options.contentClass).get(0));
67     };
68     
69     var getHash = function getHash(href) {
70          var href = href || '';
71
72          return href.replace(/.*#/, '');
73     };
74     
75     $.pageTabs.clickTab = function(tab) {
76          if (tab=='') {
77               tab = getHash($('ul li a', '.'+$.pageTabs.options.containerClass+':eq(0)').attr('href'));
78          } else if ($('#'+$.pageTabs.options.idTabPrefix+tab, '.'+$.pageTabs.options.containerClass).length==0) {
79               // try to find anchor in a .multi-part div
80               if ($('#'+tab).length==1) {
81                    var div_content = $('#'+tab).parents('.'+$.pageTabs.options.contentClass);
82                    if (div_content.length==1) {
83                         tab = div_content.attr('id').replace($.pageTabs.options.partPrefix,'');
84                    } else {
85                         tab = getHash($('ul li a', '.'+$.pageTabs.options.containerClass+':eq(0)').attr('href'));
86                    }
87               } else {
88                    tab = getHash($('ul li a', '.'+$.pageTabs.options.containerClass+':eq(0)').attr('href'));
89               }
90          }
91
92          $('ul li a', '.'+$.pageTabs.options.containerClass).filter(function() {
93               return getHash($(this).attr('href'))==tab;
94          }).parent().click();
95     };
96
97     $.pageTabs.getLocationHash = function() {
98          return getHash(document.location.hash);
99     };
100})(jQuery);
101
102jQuery.fn.tabload = function(f) {
103     this.each(function() {
104          if (f) {
105               chainHandler(this,'tabload',f)
106          } else {
107               var h = this.tabload;
108               if (h) { h.apply(this); }
109          }
110     });
111     return this;
112};
113
114jQuery.fn.onetabload = function(f) {
115     this.each(function() {
116          if (f) {
117               chainHandler(this,'onetabload',f);
118          } else {
119               var h = this.onetabload;
120               if (h != null) {
121                    h.apply(this);
122                    this.onetabload = null;
123               }
124          }
125     });
126     return this;
127};
Note: See TracBrowser for help on using the repository browser.

Sites map