jQuery DropDown Plugin CoffeeScript-el
Már egy ideje szemezgetek a CoffeeScript-el, úgyhogy készítettem vele egy legördülő menü plugint jQuery-hez. A CoffeScript egy új programnyelv ami a Javascript fölé épül, egy Ruby-hoz hasonló szintakszissal. Ha ki szeretnénk próbálni, akkor szükségünk lesz node.js-re, ezért először telepitsük fel azt: https://github.com/joyent/node/wiki/Installation. A node.js hivatalos package manager-e az npm amit az itt leírtak szerint tudsz telepíteni:http://npmjs.org/. Ha ezzel megvagyunk akkor a CoffeScript telepítését az alábbi parancs-al tudjuk megtenni:npm install coffee-script
Leírom hogyan készült a plugin, egyfajta CoffeeScript ismertetőként.
A jQuery plugin fejlesztési irányelveket követve a kódunk egy closure-ba lesz csomagolva, hogy a változóink ne zavarjanak be a globális névtérbe. Ezt CoffeScript-el ígz tudjuk megvalósítani:
$ = jQuery
Ha ezt a kódot átfuttatjuk a fordítónk ezt kapjuk:
(function() { var $; $ = jQuery; }).call(this);
Ebből is látható, hogy a CoffeScript-el kevesebb kóddal, többmindent tudunk megvalósítani, amit án nagyon szeretek. A plugin fejlesztési irányelvek alapján, összeraktam egy boilerplate szerűséget, és ezt átírtam CoffeeScriptre:
### Licence goes here ### $ = jQuery #settings for the plugin settings = { } methods = ### initializes the plugin ### init: (options) -> if options $.extend settings, options ### helper method to use the console.log if available ### log: (message) -> try console.log message catch e $.fn.dropdown = ( method ) -> if methods[method] methods[method].apply( this, Array.prototype.slice.call( arguments, 1 )) else if typeof method == 'object' || ! method methods.init.apply( this, arguments ) else $.error( 'Method ' + method + ' does not exist on jQuery.tooltip' )A fenti kód támogatja a metódusok meghívását, a chainability-t, és a konfigurálását a pluginnak. Ezekről itt olvashatsz részletesebben: http://docs.jquery.com/Plugins/Authoring
A dropdown plugin elég egyszerű működés szempontjából. Mouseenter event-re láthatóvá tesszük az almenüt, mouseleave-re pedig elrejtjük. Szükségünk lesz még arra, hogy a felső szintű navigaciós elemeknek relative position-t adjunk, a bennük lévő almenünek pedig absolute position-t:
<style> nav li{ float:left; padding:2px 5px; list-style:none; position:relative; } nav li ul { position:absolute; top:15px; left:0; padding:0; } nav li ul li{ clear:both; } <nav> <ul> <li> <a href="#">Main element 1</a> <ul> <li>Sub element 1</li> </ul> </li> <li> <a href="#">Main element 2</a> <ul> <li>Sub element 2</li> </ul> </li> </ul> </nav> Â
Ezután visszatérhetünk a pluginhoz és az init metódusban megvalósítjuk a funkcionalitást:
init: (options) -> return $(this).children('li').each -> if options $.extend settings, options $this = $(this) ##hide all subnav element $this.children('ul').hide() $this.mouseenter -> if settings.effect_in? eval "$(this).children('ul')." + settings.effect_in + "(" + settings.options_in + ")" else $(this).children('ul').show() $this.mouseleave -> if settings.effect_in? eval "$(this).children('ul')." + settings.effect_out + "(" + settings.options_out + ")" else $(this).children('ul').hide()
Végigmegyünk a selector-al kiválasztott elem li elemein és mindegyikre ráakasztunk egy mouseenter és egy mouseleave eseménykezelőt. Ellenőrizzük, hogy a plugin meghívásánál be lett e állítva barmilyen effect és ha igen, akkor egy eval segítségével azt használjuk, ha nem, akkor egy sima hide/show effectet.
A kész plugin egy mintafájl-al letölthető a github-ról:
https://github.com/gregmolnar/jquery-dropdown

