ru-se.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

drop_menu_selection.js (7645B)


      1 /* global jQuery */
      2 
      3 (function ($) {
      4 
      5     // tap event
      6 	 if (!$.event.special.tap) {
      7 		$.event.special.tap = {
      8 		  setup: function(data, namespaces) {
      9 			var $elem = $(this);
     10 			$elem
     11 			  .bind('touchstart', $.event.special.tap.handler)
     12 			  .bind('touchmove', $.event.special.tap.handler)
     13 			  .bind('touchend', $.event.special.tap.handler);
     14 		  },
     15 
     16 		  teardown: function(namespaces) {
     17 			var $elem = $(this);
     18 			$elem
     19 			  .unbind('touchstart', $.event.special.tap.handler)
     20 			  .unbind('touchmove', $.event.special.tap.handler)
     21 			  .unbind('touchend', $.event.special.tap.handler);
     22 		  },
     23 
     24 		  handler: function(event) {
     25 			var $elem = $(this),
     26 			  handleObj = event.handleObj,
     27 			  result;
     28 			$elem.data(event.type, 1);
     29 			if (event.type === 'touchend' && !$elem.data('touchmove')) {
     30 			  event.type = 'tap';
     31 			  result = handleObj.handler.call(this, event);
     32 			} else if ($elem.data('touchend')) {
     33 			  $elem.removeData('touchstart touchmove touchend');
     34 			}
     35 
     36 			return result;
     37 		  },
     38 		};
     39 	  }
     40 
     41 
     42 
     43     function deselectItems($menu) {
     44         $menu.find('[data-selected-item]').each(function () {
     45             var $item = $(this);
     46             $item.removeAttr('data-selected-item');
     47             var $submenu = $menu.children('ul');
     48             if ($menu.is('.mobile-menu')) {
     49                 $submenu.slideDown();
     50             }
     51         });
     52 
     53     }
     54 
     55     function clearSelectionWhenTapOutside($this, $menu) {
     56         $('body').off('tap.navigation-clear-selection');
     57         $(window).off('scroll.navigation-clear-selection');
     58         if ($this.is($menu) || $.contains($menu[0], this)) {
     59             return;
     60         }
     61         clearMenuHovers($menu);
     62     }
     63 
     64     function selectItem($menu, $item) {
     65         deselectItems($menu);
     66         $item.attr('data-selected-item', true);
     67         clearMenuHovers($menu, $item);
     68         $item.addClass('hover');
     69         setOpenReverseClass($menu, $item);
     70         $('body').on('tap.navigation-clear-selection', '*', function () {
     71             var $this = jQuery(this);
     72             clearSelectionWhenTapOutside($this, $menu);
     73         });
     74 
     75         $(window).on('scroll.navigation-clear-selection', function () {
     76             var $this = jQuery(this);
     77             clearSelectionWhenTapOutside($this, $menu);
     78         });
     79     }
     80 
     81     function isSelectedItem($item) {
     82         return $item.is('[data-selected-item]');
     83     }
     84 
     85 
     86     function containsSelectedItem($item) {
     87         return (($item.find('[data-selected-item]').length > 0) || $item.is('[data-selected-item]'));
     88     }
     89 
     90     function clearMenuHovers($menu, except) {
     91 
     92         $menu.find('li.hover').each(function () {
     93             if (except && containsSelectedItem($(this))) {
     94                 return;
     95             }
     96             $(this).removeClass('hover');
     97         });
     98 
     99     }
    100 
    101     function getItemLevel($menu, $item) {
    102         return $item.parentsUntil('ul.dorpdown-menu').filter('li').length;
    103     }
    104 
    105     function setOpenReverseClass($menu, $item) {
    106         // level 0 - not in dropdown
    107         if (getItemLevel($menu, $item) > 0) {
    108             var $submenu = $item.children('ul');
    109             var subItemDoesNotFit = ($submenu.length && ($item.offset().left + $item.width() + 300) > window.innerWidth);
    110             var parentsAreReversed = ($submenu.length && $item.closest('.open-reverse').length);
    111 
    112             if (subItemDoesNotFit || parentsAreReversed) {
    113                 $submenu.addClass('open-reverse');
    114             } else {
    115                 if ($submenu.length) {
    116                     $submenu.removeClass('open-reverse');
    117                 }
    118             }
    119         }
    120     }
    121 
    122     $('ul.dropdown-menu').each(function () {
    123         var $menu = $(this);
    124 
    125         if ($menu.hasClass('mobile-menu')) {
    126             var $mobileToggler = $('<a href="#" data-menu-toggler="">Menu</a>');
    127             $menu.before($mobileToggler);
    128 
    129             // mobile
    130             $mobileToggler.click(function () {
    131 
    132                 if ($mobileToggler.hasClass('opened')) {
    133 
    134                     $menu.slideUp(300, function () {
    135                         $menu.css('display', '');
    136                     });
    137                     $menu.removeClass('mobile-menu');
    138                     $mobileToggler.removeClass('opened');
    139 
    140                 }
    141                 else {
    142 
    143                     $mobileToggler.addClass('opened');
    144                     $menu.slideDown();
    145                     $menu.addClass('mobile-menu');
    146 
    147                     clearMenuHovers($menu);
    148                     deselectItems($menu);
    149                 }
    150 
    151             });
    152         }
    153 
    154         var $currentSelectedItem = $("");
    155         // on tablet
    156         $menu.on('tap.navigation', 'li.menu-item > a, li.page_item > a', function (event) {
    157             var $link = $(this);
    158             var $item = $link.parent();
    159             var $submenu = $item.children('ul');
    160 
    161             if ($submenu.length) {
    162 
    163                 if (isSelectedItem($item)) {
    164                     var href = $link.attr('href');
    165 
    166                     // do nothing if nothing
    167                     if (href.indexOf('#') === 0) {
    168                         var anchor = href.replace('#', '').trim();
    169 
    170                         if (!anchor || !$('#' + anchor).length) {
    171                             return;
    172                         }
    173                     }
    174                     deselectItems($menu);
    175                 } else {
    176                     selectItem($menu, $item);
    177                     event.preventDefault();
    178                     event.stopPropagation();
    179                 }
    180 
    181             } else {
    182                 event.stopPropagation();
    183                 deselectItems($menu);
    184             }
    185 
    186         });
    187 
    188 
    189         $menu.on('mouseover.navigation', 'li', function () {
    190             $menu.find('li.hover').removeClass('hover');
    191             setOpenReverseClass($menu, $(this));
    192         });
    193 
    194         addMenuScrollSpy($menu);
    195     });
    196 
    197     function addMenuScrollSpy(startFrom) {
    198 
    199         var $menu = startFrom;
    200 
    201         if ($.fn.scrollSpy) {
    202             $menu.find('a').scrollSpy({
    203                 onChange: function () {
    204                     $menu.find('.current-menu-item,.current_page_item').removeClass('current-menu-item current_page_item');
    205                     $(this).closest('li').addClass('current-menu-item');
    206                 },
    207                 onLeave: function () {
    208                     $(this).closest('li').removeClass('current-menu-item current_page_item');
    209                 },
    210                 smoothScrollAnchor: true,
    211                 offset: function () {
    212                     var $fixed = $('.navigation-bar.fixto-fixed');
    213                     if ($fixed.length) {
    214                         return $fixed[0].getBoundingClientRect().height;
    215                     }
    216 
    217                     return 0;
    218                 }
    219             });
    220         }
    221 
    222         $(window).trigger('smoothscroll.update');
    223     }
    224 
    225     $(function () {
    226 
    227         if (window.wp && window.wp.customize) {
    228             jQuery('.offcanvas_menu').find('li > ul').eq(0).each(function () {
    229                 jQuery(this).show();
    230                 jQuery(this).parent().addClass('open')
    231             });
    232 
    233             window.wp.customize.selectiveRefresh.bind('render-partials-response', function (response) {
    234                 var menuKeys = Object.getOwnPropertyNames(response.contents).filter(function (key) {
    235                     return key.indexOf('nav_menu_instance[') !== -1;
    236                 });
    237 
    238                 if (menuKeys.length) {
    239 
    240                     setTimeout(function () {
    241                         $('ul.dropdown-menu').each(function () {
    242                             addMenuScrollSpy($(this));
    243                         });
    244                     }, 1000);
    245 
    246                 }
    247             });
    248         }
    249 
    250     });
    251 
    252 })(jQuery);