I have the following code that I wrote, which I personally found to be pretty nice. It takes a <ul> and it drops down the contents when clicked. But I am having a disconnect here in comprehension, and one I had to do what I feel is a ‘dirty hack’ to solve.
The problem is that I do not want the class `’sidebar-dropdown-open’ to be so ‘hardwired’ in the plugin. However I discovered that there is a very stark difference between…
$('.sidebar-dropdown-open') and 'sidebar-dropdown-open and even '.sidebar-dropdown-open.
I ‘solved’ this problem by including two different ‘parameters’ in my plugin, but I was wondering if someone might give me some insight as to how I could perform this better, and why this was behaving this way.
wiring (document load)
$(document).ready(function () {
$('[data-role="sidebar-dropdown"]').drawer({
open: 'sidebar-dropdown-open',
css: '.sidebar-dropdown-open'
});
});
html
<ul>
<li class=" dropdown" data-role="sidebar-dropdown">
<a href="pages/.." class="remote">Link Text</a>
<ul class="sub-menu light sidebar-dropdown-menu">
<li><a class="remote" href="pages/...">Link Text</a></li>
<li><a class="remote" href="pages/...">Link Text</a></li>
<li><a class="remote" href="pages/...">Link Text</a></li>
</ul>
</li>
</ul>
javascript
(function ($) {
$.fn.drawer = function (options) {
// Create some defaults, extending them with any options that were provided
var settings = $.extend({
open: 'open',
css: '.open'
}, options);
return this.each(function () {
$(this).on('click', function (e) {
// slide up all open dropdown menus
$(settings.css).not($(this)).each(function () {
$(this).removeClass(settings.open);
// retrieve the appropriate menu item
var $menu = $(this).children(".dropdown-menu, .sidebar-dropdown-menu");
// slide down the one clicked on.
$menu.slideUp('fast');
$menu.removeClass('active');
});
// mark this menu as open
$(this).addClass(settings.open);
// retrieve the appropriate menu item
var $menu = $(this).children(".dropdown-menu, .sidebar-dropdown-menu");
// slide down the one clicked on.
$menu.slideDown(100);
$menu.addClass('active');
e.preventDefault();
e.stopPropagation();
}).on("mouseleave", function () {
$(this).children(".dropdown-menu").hide().delay(300);
});
})
};
})(jQuery);
jQuery selectors are styled exactly like css selectors making it very easy to learn for both designers and developers. In my opinion, you should just use one parameter and require it to be a classname, not a selector because if it were a selector, someone may think they can instead use an ID selector or a more complex selector there which would break your code.