PluginProbe
Responsive Menu – Create Mobile-Friendly Menu / 4.1.1
Responsive Menu – Create Mobile-Friendly Menu v4.1.1
4.7.4 4.7.3 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.10 4.1.11 4.1.12 4.1.2 4.1.3 4.1.4 4.1.5 4.1.6 4.1.7 4.1.8 4.1.9 All 91 releases
responsive-menu / public / js / app.js.twig

app.js.twig in Responsive Menu – Create Mobile-Friendly Menu 4.1.1, at public/js/app.js.twig

280 lines 13.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 jQuery(document).ready(function($) {
2
3 var ResponsiveMenu = {
4 trigger: '{{ options.button_click_trigger }}',
5 animationSpeed: {{ options.animation_speed * 1000 }},
6 breakpoint: {{ options.breakpoint }},
7 pushButton: '{{ options.button_push_with_animation }}',
8 animationType: '{{ options.animation_type }}',
9 animationSide: '{{ options.menu_appear_from }}',
10 pageWrapper: '{{ options.page_wrapper }}',
11 isOpen: false,
12 triggerTypes: 'click',
13 activeClass: 'is-active',
14 container: '#responsive-menu-container',
15 openClass: 'responsive-menu-open',
16 accordion: '{{ options.accordion_animation }}',
17 activeArrow: '{{ options.getActiveArrow() }}',
18 inactiveArrow: '{{ options.getInActiveArrow() }}',
19 wrapper: '#responsive-menu-wrapper',
20 closeOnBodyClick: '{{ options.menu_close_on_body_click }}',
21 closeOnLinkClick: '{{ options.menu_close_on_link_click }}',
22 itemTriggerSubMenu: '{{ options.menu_item_click_to_trigger_submenu }}',
23 linkElement: '.responsive-menu-item-link',
24 subMenuTransitionTime: {{ options.sub_menu_speed * 1000 }},
25 openMenu: function() {
26 $(this.trigger).addClass(this.activeClass);
27 $('html').addClass(this.openClass);
28 $('.responsive-menu-button-icon-active').hide();
29 $('.responsive-menu-button-icon-inactive').show();
30 this.setButtonTextOpen();
31 this.setWrapperTranslate();
32 this.isOpen = true;
33 },
34 closeMenu: function() {
35 $(this.trigger).removeClass(this.activeClass);
36 $('html').removeClass(this.openClass);
37 $('.responsive-menu-button-icon-inactive').hide();
38 $('.responsive-menu-button-icon-active').show();
39 this.setButtonText();
40 this.clearWrapperTranslate();
41 this.isOpen = false;
42 },
43 setButtonText: function() {
44 if($('.responsive-menu-button-text-open').length > 0 && $('.responsive-menu-button-text').length > 0) {
45 $('.responsive-menu-button-text-open').hide();
46 $('.responsive-menu-button-text').show();
47 }
48 },
49 setButtonTextOpen: function() {
50 if($('.responsive-menu-button-text').length > 0 && $('.responsive-menu-button-text-open').length > 0) {
51 $('.responsive-menu-button-text').hide();
52 $('.responsive-menu-button-text-open').show();
53 }
54 },
55 triggerMenu: function() {
56 this.isOpen ? this.closeMenu() : this.openMenu();
57 },
58 triggerSubArrow: function(subarrow) {
59 var sub_menu = $(subarrow).parent().siblings('.responsive-menu-submenu');
60 var self = this;
61 if(this.accordion == 'on') {
62 /* Get Top Most Parent and the siblings */
63 var top_siblings = sub_menu.parents('.responsive-menu-item-has-children').last().siblings('.responsive-menu-item-has-children');
64 var first_siblings = sub_menu.parents('.responsive-menu-item-has-children').first().siblings('.responsive-menu-item-has-children');
65 /* Close up just the top level parents to key the rest as it was */
66 top_siblings.children('.responsive-menu-submenu').slideUp(self.subMenuTransitionTime, 'linear').removeClass('responsive-menu-submenu-open');
67 /* Set each parent arrow to inactive */
68 top_siblings.each(function() {
69 $(this).find('.responsive-menu-subarrow').first().html(self.inactiveArrow);
70 $(this).find('.responsive-menu-subarrow').first().removeClass('responsive-menu-subarrow-active');
71 });
72 /* Now Repeat for the current item siblings */
73 first_siblings.children('.responsive-menu-submenu').slideUp(self.subMenuTransitionTime, 'linear').removeClass('responsive-menu-submenu-open');
74 first_siblings.each(function() {
75 $(this).find('.responsive-menu-subarrow').first().html(self.inactiveArrow);
76 $(this).find('.responsive-menu-subarrow').first().removeClass('responsive-menu-subarrow-active');
77 });
78 }
79 if(sub_menu.hasClass('responsive-menu-submenu-open')) {
80 sub_menu.slideUp(self.subMenuTransitionTime, 'linear').removeClass('responsive-menu-submenu-open');
81 $(subarrow).html(this.inactiveArrow);
82 $(subarrow).removeClass('responsive-menu-subarrow-active');
83 } else {
84 sub_menu.slideDown(self.subMenuTransitionTime, 'linear').addClass('responsive-menu-submenu-open');
85 $(subarrow).html(this.activeArrow);
86 $(subarrow).addClass('responsive-menu-subarrow-active');
87 }
88 },
89 menuHeight: function() {
90 return $(this.container).height();
91 },
92 menuWidth: function() {
93 return $(this.container).width();
94 },
95 wrapperHeight: function() {
96 return $(this.wrapper).height();
97 },
98 setWrapperTranslate: function() {
99 switch(this.animationSide) {
100 case 'left':
101 translate = 'translateX(' + this.menuWidth() + 'px)'; break;
102 case 'right':
103 translate = 'translateX(-' + this.menuWidth() + 'px)'; break;
104 case 'top':
105 translate = 'translateY(' + this.wrapperHeight() + 'px)'; break;
106 case 'bottom':
107 translate = 'translateY(-' + this.menuHeight() + 'px)'; break;
108 }
109 if(this.animationType == 'push') {
110 $(this.pageWrapper).css({'transform':translate});
111 $('html, body').css('overflow-x', 'hidden');
112 }
113 if(this.pushButton == 'on') {
114 $('#responsive-menu-button').css({'transform':translate});
115 }
116 },
117 clearWrapperTranslate: function() {
118 var self = this;
119 if(this.animationType == 'push') {
120 $(this.pageWrapper).css({'transform':''});
121 setTimeout(function() {
122 $('html, body').css('overflow-x', '');
123 }, self.animationSpeed);
124 }
125 if(this.pushButton == 'on') {
126 $('#responsive-menu-button').css({'transform':''});
127 }
128 },
129 init: function() {
130 var self = this;
131 $(this.trigger).on(this.triggerTypes, function(e){
132 e.stopPropagation();
133 self.triggerMenu();
134 });
135 $(this.trigger).mouseup(function(){
136 $(self.trigger).blur();
137 });
138 $('.responsive-menu-subarrow').on('click', function(e) {
139 e.preventDefault();
140 e.stopPropagation();
141 self.triggerSubArrow(this);
142 });
143 $(window).resize(function() {
144 if($(window).width() > self.breakpoint) {
145 if(self.isOpen){
146 self.closeMenu();
147 }
148 } else {
149 if($('.responsive-menu-open').length>0){
150 self.setWrapperTranslate();
151 }
152 }
153 });
154 if(this.closeOnLinkClick == 'on') {
155 $(this.linkElement).on('click', function(e) {
156 e.preventDefault();
157 /* Fix for when close menu on parent clicks is on */
158 if(self.itemTriggerSubMenu == 'on' && $(this).is('.responsive-menu-item-has-children > ' + self.linkElement)) {
159 return;
160 }
161 old_href = $(this).attr('href');
162 old_target = typeof $(this).attr('target') == 'undefined' ? '_self' : $(this).attr('target');
163 if(self.isOpen) {
164 if($(e.target).closest('.responsive-menu-subarrow').length) {
165 return;
166 }
167 self.closeMenu();
168 setTimeout(function() {
169 window.open(old_href, old_target);
170 }, self.animationSpeed);
171 }
172 });
173 }
174 if(this.closeOnBodyClick == 'on') {
175 $(document).on('click', 'body', function(e) {
176 if(self.isOpen) {
177 if($(e.target).closest('#responsive-menu-container').length || $(e.target).closest('#responsive-menu-button').length) {
178 return;
179 }
180 }
181 self.closeMenu();
182 });
183 }
184 if(this.itemTriggerSubMenu == 'on') {
185 $('.responsive-menu-item-has-children > ' + this.linkElement).on('click', function(e) {
186 e.preventDefault();
187 self.triggerSubArrow($(this).children('.responsive-menu-subarrow').first());
188 });
189 }
190
191 {# Handle accessibility for slidebar menu. #}
192 if (jQuery('#responsive-menu-button').css('display') != 'none') {
193 $('#responsive-menu-button,#responsive-menu a.responsive-menu-item-link, #responsive-menu-wrapper input').focus( function() {
194 $(this).addClass('is-active');
195 $('html').addClass('responsive-menu-open');
196 $('#responsive-menu li').css({"opacity": "1", "margin-left": "0"});
197 });
198
199 $('#responsive-menu-button, a.responsive-menu-item-link,#responsive-menu-wrapper input').focusout( function() {
200 if ( $(this).last('#responsive-menu-button a.responsive-menu-item-link') ) {
201 $(this).removeClass('is-active');
202 $('html').removeClass('responsive-menu-open');
203 }
204 });
205 }
206
207 {# Handling menu with arrow keys #}
208 $('#responsive-menu a.responsive-menu-item-link').keydown(function(event) {
209 console.log( event.keyCode );
210 if ( [13,27,32,35,36,37,38,39,40].indexOf( event.keyCode) == -1) {
211 return;
212 }
213 var link = $(this);
214 switch(event.keyCode) {
215 case 13:
216 {# Press enter key to activate the link. #}
217 link.click();
218 break;
219 case 27:
220 {# Escape key to close the active submenu. #}
221 var dropdown = link.parent('li').parents('.responsive-menu-submenu');
222 if ( dropdown.length > 0 ) {
223 dropdown.hide();
224 dropdown.prev().focus();
225 }
226 break;
227
228 case 32:
229 {# Space enter key to open submenu. #}
230 var dropdown = link.parent('li').find('.responsive-menu-submenu');
231 if ( dropdown.length > 0 ) {
232 dropdown.show();
233 dropdown.find('a, input, button, textarea').first().focus();
234 }
235 break;
236
237 case 35:
238 {# End key to move the focus on last menu item. #}
239 var dropdown = link.parent('li').find('.responsive-menu-submenu');
240 if ( dropdown.length > 0 ) {
241 dropdown.hide();
242 }
243 $(this).parents('#responsive-menu').find('a.responsive-menu-item-link').filter(':visible').last().focus();
244 break;
245 case 36:
246 {# Home key move the focus on first element of menu. #}
247 var dropdown = link.parent('li').find('.responsive-menu-submenu');
248 if( dropdown.length > 0 ) {
249 dropdown.hide();
250 }
251 $(this).parents('#responsive-menu').find('a.responsive-menu-item-link').filter(':visible').first().focus();
252 break;
253 case 37:
254 case 38:
255 event.preventDefault();
256 event.stopPropagation();
257 {# Handle left/up arrow key event. #}
258 if ( link.parent('li').prevAll('li').filter(':visible').first().length == 0) {
259 link.parent('li').nextAll('li').filter(':visible').last().find('a').first().focus();
260 } else {
261 link.parent('li').prevAll('li').filter(':visible').first().find('a').first().focus();
262 }
263 break;
264 case 39:
265 case 40:
266 event.preventDefault();
267 event.stopPropagation();
268 {# Handle right/down arrow key event. #}
269 if( link.parent('li').nextAll('li').filter(':visible').first().length == 0) {
270 link.parent('li').prevAll('li').filter(':visible').last().find('a').first().focus();
271 } else {
272 link.parent('li').nextAll('li').filter(':visible').first().find('a').first().focus();
273 }
274 break;
275 }
276 });
277 }
278 };
279 ResponsiveMenu.init();
280 });