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);