Dotclear


Ignore:
Timestamp:
01/28/18 13:16:06 (8 years ago)
Author:
franck <carnet.franck.paul@…>
Branch:
default
Message:

Focus (and visually show) the subhash if possible

File:
1 edited

Legend:

Unmodified
Added
Removed
  • admin/js/jquery/jquery.pageTabs.js

    r3333 r3690  
    11(function($) { 
    2      'use strict'; 
     2  'use strict'; 
    33 
    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           }; 
     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    }; 
    1212 
    13           $.pageTabs.options = $.extend({}, defaults, opts); 
    14           var active_tab = start_tab || ''; 
    15           var hash = $.pageTabs.getLocationHash(); 
    16           var subhash = $.pageTabs.getLocationSubhash(); 
     13    $.pageTabs.options = $.extend({}, defaults, opts); 
     14    var active_tab = start_tab || ''; 
     15    var hash = $.pageTabs.getLocationHash(); 
     16    var subhash = $.pageTabs.getLocationSubhash(); 
    1717 
    18           if (hash !== undefined && hash) { 
    19                window.scrollTo(0,0); 
    20                active_tab = hash; 
    21           } else if (active_tab == '') { // open first part 
    22                active_tab = $('.'+$.pageTabs.options.contentClass+':eq(0)').attr('id'); 
    23           } 
     18    if (hash !== undefined && hash) { 
     19      window.scrollTo(0, 0); 
     20      active_tab = hash; 
     21    } else if (active_tab == '') { // open first part 
     22      active_tab = $('.' + $.pageTabs.options.contentClass + ':eq(0)').attr('id'); 
     23    } 
    2424 
    25           createTabs(); 
     25    createTabs(); 
    2626 
    27           $('ul li', '.'+$.pageTabs.options.containerClass).click(function(e) { 
    28                if ($(this).hasClass($.pageTabs.options.activeClass)) { 
    29                     return; 
    30                } 
     27    $('ul li', '.' + $.pageTabs.options.containerClass).click(function(e) { 
     28      if ($(this).hasClass($.pageTabs.options.activeClass)) { 
     29        return; 
     30      } 
    3131 
    32                $(this).parent().find('li.'+$.pageTabs.options.activeClass).removeClass($.pageTabs.options.activeClass); 
    33                $(this).addClass($.pageTabs.options.activeClass); 
    34                $('.'+$.pageTabs.options.contentClass+'.active').removeClass('active').hide(); 
     32      $(this).parent().find('li.' + $.pageTabs.options.activeClass).removeClass($.pageTabs.options.activeClass); 
     33      $(this).addClass($.pageTabs.options.activeClass); 
     34      $('.' + $.pageTabs.options.contentClass + '.active').removeClass('active').hide(); 
    3535 
    36                var part_to_activate = $('#'+$.pageTabs.options.partPrefix+getHash($(this).find('a').attr('href'))); 
     36      var part_to_activate = $('#' + $.pageTabs.options.partPrefix + getHash($(this).find('a').attr('href'))); 
    3737 
    38                part_to_activate.addClass('active').show(); 
    39                if (!part_to_activate.hasClass('loaded')) { 
    40                     part_to_activate.onetabload(); 
    41                     part_to_activate.addClass('loaded'); 
    42                } 
     38      part_to_activate.addClass('active').show(); 
     39      if (!part_to_activate.hasClass('loaded')) { 
     40        part_to_activate.onetabload(); 
     41        part_to_activate.addClass('loaded'); 
     42      } 
    4343 
    44                part_to_activate.tabload(); 
    45           }); 
     44      part_to_activate.tabload(); 
     45    }); 
    4646 
    47           $(window).bind('hashchange onhashchange', function(e) { 
    48                $.pageTabs.clickTab($.pageTabs.getLocationHash()); 
    49           }); 
     47    $(window).bind('hashchange onhashchange', function(e) { 
     48      $.pageTabs.clickTab($.pageTabs.getLocationHash()); 
     49    }); 
    5050 
    51           $.pageTabs.clickTab(active_tab); 
     51    $.pageTabs.clickTab(active_tab); 
    5252 
    53           if (subhash !== undefined) { 
    54                // Tab displayed, now scroll to the sub-part if defined in original document.location (#tab.sub-part) 
    55                document.getElementById(subhash).scrollIntoView(); 
    56           } 
     53    if (subhash !== undefined) { 
     54      var elt = document.getElementById(subhash); 
     55      // Tab displayed, now scroll to the sub-part if defined in original document.location (#tab.sub-part) 
     56      elt.scrollIntoView() 
     57      // Give focus to the sub-part if possible 
     58      $('#' + subhash).addClass('focus').focusout(function() { 
     59        $(this).removeClass('focus'); 
     60      }); 
     61      elt.focus(); 
     62    } 
    5763 
    58           return this; 
    59      }; 
     64    return this; 
     65  }; 
    6066 
    61      var createTabs = function createTabs() { 
    62           var lis = [], li_class = ''; 
     67  var createTabs = function createTabs() { 
     68    var lis = [], 
     69      li_class = ''; 
    6370 
    64           $('.'+$.pageTabs.options.contentClass).each(function() { 
    65                $(this).hide(); 
    66                lis.push('<li id="'+$.pageTabs.options.idTabPrefix+$(this).attr('id')+'">' 
    67                      +'<a href="#'+$(this).attr('id')+'">'+$(this).attr('title')+'</a></li>'); 
    68                $(this).attr('id', $.pageTabs.options.partPrefix + $(this).attr('id')).prop('title',''); 
    69           }); 
     71    $('.' + $.pageTabs.options.contentClass).each(function() { 
     72      $(this).hide(); 
     73      lis.push('<li id="' + $.pageTabs.options.idTabPrefix + $(this).attr('id') + '">' + 
     74        '<a href="#' + $(this).attr('id') + '">' + $(this).attr('title') + '</a></li>'); 
     75      $(this).attr('id', $.pageTabs.options.partPrefix + $(this).attr('id')).prop('title', ''); 
     76    }); 
    7077 
    71           $('<div class="'+$.pageTabs.options.containerClass+'"><ul>'+lis.join('')+'</ul></div>') 
    72                .insertBefore($('.'+$.pageTabs.options.contentClass).get(0)); 
    73      }; 
     78    $('<div class="' + $.pageTabs.options.containerClass + '"><ul>' + lis.join('') + '</ul></div>') 
     79      .insertBefore($('.' + $.pageTabs.options.contentClass).get(0)); 
     80  }; 
    7481 
    75      var getHash = function getHash(href) { 
    76           var href = href || ''; 
     82  var getHash = function getHash(href) { 
     83    var href = href || ''; 
    7784 
    78           return href.replace(/.*#/, ''); 
    79      }; 
     85    return href.replace(/.*#/, ''); 
     86  }; 
    8087 
    81      $.pageTabs.clickTab = function(tab) { 
    82           if (tab=='') { 
    83                tab = getHash($('ul li a', '.'+$.pageTabs.options.containerClass+':eq(0)').attr('href')); 
    84           } else if ($('#'+$.pageTabs.options.idTabPrefix+tab, '.'+$.pageTabs.options.containerClass).length==0) { 
    85                // try to find anchor in a .multi-part div 
    86                if ($('#'+tab).length==1) { 
    87                     var div_content = $('#'+tab).parents('.'+$.pageTabs.options.contentClass); 
    88                     if (div_content.length==1) { 
    89                          tab = div_content.attr('id').replace($.pageTabs.options.partPrefix,''); 
    90                     } else { 
    91                          tab = getHash($('ul li a', '.'+$.pageTabs.options.containerClass+':eq(0)').attr('href')); 
    92                     } 
    93                } else { 
    94                     tab = getHash($('ul li a', '.'+$.pageTabs.options.containerClass+':eq(0)').attr('href')); 
    95                } 
    96           } 
     88  $.pageTabs.clickTab = function(tab) { 
     89    if (tab == '') { 
     90      tab = getHash($('ul li a', '.' + $.pageTabs.options.containerClass + ':eq(0)').attr('href')); 
     91    } else if ($('#' + $.pageTabs.options.idTabPrefix + tab, '.' + $.pageTabs.options.containerClass).length == 0) { 
     92      // try to find anchor in a .multi-part div 
     93      if ($('#' + tab).length == 1) { 
     94        var div_content = $('#' + tab).parents('.' + $.pageTabs.options.contentClass); 
     95        if (div_content.length == 1) { 
     96          tab = div_content.attr('id').replace($.pageTabs.options.partPrefix, ''); 
     97        } else { 
     98          tab = getHash($('ul li a', '.' + $.pageTabs.options.containerClass + ':eq(0)').attr('href')); 
     99        } 
     100      } else { 
     101        tab = getHash($('ul li a', '.' + $.pageTabs.options.containerClass + ':eq(0)').attr('href')); 
     102      } 
     103    } 
    97104 
    98           $('ul li a', '.'+$.pageTabs.options.containerClass).filter(function() { 
    99                return getHash($(this).attr('href'))==tab; 
    100           }).parent().click(); 
    101      }; 
     105    $('ul li a', '.' + $.pageTabs.options.containerClass).filter(function() { 
     106      return getHash($(this).attr('href')) == tab; 
     107    }).parent().click(); 
     108  }; 
    102109 
    103      $.pageTabs.getLocationHash = function() { 
    104           // Return the URL hash (without subhash — #hash[.subhash]) 
    105           var h = getHash(document.location.hash).split('.'); 
    106           return h[0]; 
    107      }; 
    108      $.pageTabs.getLocationSubhash = function() { 
    109           // Return the URL subhash if present (without hash — #hash[.subhash]) 
    110           var sh = getHash(document.location.hash).split('.'); 
    111           return sh[1]; 
    112      }; 
     110  $.pageTabs.getLocationHash = function() { 
     111    // Return the URL hash (without subhash — #hash[.subhash]) 
     112    var h = getHash(document.location.hash).split('.'); 
     113    return h[0]; 
     114  }; 
     115  $.pageTabs.getLocationSubhash = function() { 
     116    // Return the URL subhash if present (without hash — #hash[.subhash]) 
     117    var sh = getHash(document.location.hash).split('.'); 
     118    return sh[1]; 
     119  }; 
    113120})(jQuery); 
    114121 
    115122jQuery.fn.tabload = function(f) { 
    116      this.each(function() { 
    117           if (f) { 
    118                chainHandler(this,'tabload',f) 
    119           } else { 
    120                var h = this.tabload; 
    121                if (h) { h.apply(this); } 
    122           } 
    123      }); 
    124      return this; 
     123  this.each(function() { 
     124    if (f) { 
     125      chainHandler(this, 'tabload', f) 
     126    } else { 
     127      var h = this.tabload; 
     128      if (h) { 
     129        h.apply(this); 
     130      } 
     131    } 
     132  }); 
     133  return this; 
    125134}; 
    126135 
    127136jQuery.fn.onetabload = function(f) { 
    128      this.each(function() { 
    129           if (f) { 
    130                chainHandler(this,'onetabload',f); 
    131           } else { 
    132                var h = this.onetabload; 
    133                if (h != null) { 
    134                     h.apply(this); 
    135                     this.onetabload = null; 
    136                } 
    137           } 
    138      }); 
    139      return this; 
     137  this.each(function() { 
     138    if (f) { 
     139      chainHandler(this, 'onetabload', f); 
     140    } else { 
     141      var h = this.onetabload; 
     142      if (h != null) { 
     143        h.apply(this); 
     144        this.onetabload = null; 
     145      } 
     146    } 
     147  }); 
     148  return this; 
    140149}; 
Note: See TracChangeset for help on using the changeset viewer.

Sites map