-
Notifications
You must be signed in to change notification settings - Fork 23
/
jQuery.menutron.js
114 lines (89 loc) · 3.16 KB
/
jQuery.menutron.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*
* Copyright (c) 2012 Mike King @micjamking (http://dev.85pixels.com)
*
* jQuery Menutron plugin
* Version 1.0 (March 2012)
*
* Licensed under the MIT License
*/
(function($){
$.fn.menutron = function(options) {
var defaults = {
maxScreenWidth: 600,
menuTitle: 'Choose...'
};
var options = $.extend(defaults, options);
return this.each(function() {
var menu = $(this).children();
var selectMenu = $('<select>').css("display", "none");
var optGroup = $('<optgroup>').css("display", "none");
init();
function init() {
checkWidth();
createMenu();
transformMenu();
}
function checkWidth(){
// Media query for device screens (default: 600px)
// *Note, I would like to use window.matchMedia(screenWidth).matches here, but it does not work on
// Android 2.3 (Gingerbread). https://developer.mozilla.org/en/DOM/window.matchMedia#section_4
if ($(window).width() < options.maxScreenWidth){
// Hides the original menu list from the display
$(selectMenu).css("display", "inline-block");
// Hides the original menu list from the display
$(menu).css("display", "none");
} else {
// Hides the select menu from the display
$(selectMenu).css("display", "none");
// Show the original menu list
$(menu).css("display", "block");
}
}
function createMenu(){
// Loop through the current list menu & adds the li's text
// & the anchors url to the option & it's value respectively.
$(menu).children().each(function() {
// If using a descriptive list, 'dl',
// this only adds 'dd' to selectMenu & skips over 'dt'
if($(this).get(0).tagName !== 'DT'){
if($(this).find('ul,ol,dl').length){
$(optGroup).attr("label",$(this).children(':first').text());
var option = $('<option>').text($(this).children(':first').text());
var link = $(this).children("a").attr("href");
$(option).attr("value", link);
$(option).appendTo(optGroup);
var nestedList = $(this).children().not(':first');
$(nestedList).children().each(function(){
var option = $('<option>').text($(this).text());
var link = $(this).children("a").attr("href");
$(option).attr("value", link);
$(option).appendTo(optGroup);
});
console.log(optGroup);
$(optGroup).appendTo(selectMenu);
} else {
var option = $('<option>').text($(this).text());
var link = $(this).children("a").attr("href");
$(option).attr("value", link);
$(option).appendTo(selectMenu);
}
}
});
var menuTitle = '<option selected="selected" value>' + options.menuTitle + '</option>';
// Appends the newly created list to menu's container element
$(selectMenu).prepend(menuTitle);
selectMenu.appendTo($(menu).parent());
// Change Window.location, ie. the current url,
// to the value of the selected option
selectMenu.change(function(){
if($(this).val()!=''){
window.location.href=$(this).val();
}
});
}
function transformMenu() {
$(window).resize(function(){checkWidth();});
}
});
};
})(jQuery);