-
Notifications
You must be signed in to change notification settings - Fork 0
/
jquery.dropdown.min.js
18 lines (18 loc) · 4.91 KB
/
jquery.dropdown.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* Dropdown plugin for jQuery
*
* @author Alexandru Busuioc (busuioc.alexandru@gmail.com)
* @link https://github.com/alexbusu/jquery.dropdown
*
* MIT License (MIT)
*/
(function(c){var n={enableSearch:!0,keyNav:!0};c.extend(c.expr[":"],{focused:function(a){return a.hasFocus},containsNoCase:function(a,b,d){return(b=d[3])?eval("/"+b+"/i").test(c(a).html()):!1},startsWith:function(a,b,d){return(b=d[3])?eval("/^[/s]*"+b+"/i").test(c(a).text()):!1}});var l,k="",m,e={ul:{fix_width:function(a,b){a.css("min-width","");var d=b.css("width"),c=a.css("width");parseInt(c)<parseInt(d)&&a.css("min-width",d)},fix_overflow:function(a){a=a[0];a.offsetHeight<a.scrollHeight&&(a.style.overflowY=
"scroll")},set_gravity:function(a){a.css("bottom","");var b=a.offset().top,d=c(document).scrollTop(),g=c(window).height(),b=b-d,d=a.height(),f=d>g-b;f&&0>b-(d+a.parent().height())?a.css("bottom",-(g-b)):f&&a.css({bottom:"100%"})},wheel:function(a,b){var d=c(this),g=d.height(),d=d.get(0).scrollHeight;(this.scrollTop===d-g&&0>b||0===this.scrollTop&&0<b)&&a.preventDefault()},keydown:function(a){a.preventDefault();var b=c(this),d=this.parentNode.options;if(38==a.keyCode||40==a.keyCode)return b.trigger("item-nav",
a),!1;if(13==a.keyCode)return b.trigger("item-select",a),!1;d.enableSearch&&(a=String.fromCharCode(a.keyCode),"undefined"!=typeof l&&clearTimeout(l),k+=a,a=b.find("a:startsWith("+k+"):first"),a.length||(a=b.find("a:containsNoCase("+k+"):first")),a.length&&(b.find("a").removeClass("focus"),a.addClass("focus"),b.trigger("item-focus-on-top"),m=a,m.closest("ul").find("li").css("background-color","rgba(255,255,102,.4)")),l=setTimeout(function(){"object"==typeof m&&m.closest("ul").find("li").css({backgroundColor:""});
k="";clearTimeout(l)},2E3))},itemNav:function(a,b){if(38==b.keyCode||40==b.keyCode){var d=c(this);d.find("a.focus").length||d.find("a:eq(0)").addClass("focus");var g=d.find("a.focus"),f=d.find("a").length,e=d.find("a").index(g),p=0<e?c("a:eq("+(e-1)+")",d):c("a:last",d),f=e<f-1?c("a:eq("+(e+1)+")",d):c("a:first",d);g.removeClass("focus");38==b.keyCode?p.addClass("focus"):f.addClass("focus");d.trigger("item-focus-on-top")}},itemSelect:function(a,b){13==b.keyCode&&c("a.focus",c(this)).trigger("click").closest("ul").trigger("close")},
itemFocus:function(a){a=c(this);var b=a.find("a.focus");if(b.length){a.clearQueue().stop(!0,!0);var b=b.parent().position(),d=a.scrollTop();a.animate({scrollTop:d+b.top})}}},dropdown:{update_title:function(a,b){var d=a.find(".title"),e="undefined"==typeof b.attr("title")?c('option[value="'+b.val()+'"]:first',b).html()||b.val():b.attr("title");d.html(e);a.attr("title",e)}},reload:function(a){var b=c.extend({},n,a);return this.each(function(){var a=c(this),g='div[data-rel="'+this.id+'"]',g=a.parent().find(g);
g.length&&(g.remove(),e.init.call(a,b))})},init:function(a){var b=c.extend({},n,a);return this.each(function(){var a=c(this),g=a.attr("class")?" "+a.attr("class"):"";a.attr("id")||c.utils&&c.utils.randUniqueID&&a.attr("id",c.utils.randUniqueID("dropID_"));var f=c("<ul />",{"class":"options",tabindex:"0"});a.find("option").each(function(){var a=c(this),b=a.attr("class")?' class="'+a.attr("class")+'"':"";f.append("<li"+b+'><a href="'+a.val()+'" title="'+a.html()+'">'+a.html()+"</a></li>")});var h=c("<div/>",
{"data-rel":a.attr("id"),"class":"dds"+g}).append('<div class="arrow mask"><div class="arr"></div></div><div class="title"></div>').append(f);a.prop("disabled")&&h.append('<div class="disabled"></div>');f.bind("open",function(){c(this).removeClass("closed")}).bind("focusout.dropdown close.dropdown",function(){var a=c(this);a.hasClass("closed")||a.addClass("closed")}).on("click mousedown","a",function(b){b.stopPropagation();if("mousedown"==b.type)return!1;b.preventDefault();b=c(this);a.val(b.attr("href"));
f.trigger("close");a.trigger("change")}).on("mousewheel",e.ul.wheel);if(b.keyNav)f.on("item-nav.dropdown",e.ul.itemNav).on("item-focus-on-top.dropdown",e.ul.itemFocus).on("item-select.dropdown",e.ul.itemSelect).on("keydown.dropdown",e.ul.keydown);c(window).on("scroll.dropdown",function(){f.hasClass("closed")||e.ul.set_gravity(f)});a.hide().before(h);e.dropdown.update_title(h,a);e.ul.fix_width(f,h);e.ul.fix_overflow(f);f.trigger("close");h.on("click.dropdown",function(){a.prop("disabled")||h.find(".title").click()}).get(0).options=
b;h.find(".title,.arrow").on({mousedown:function(a){a.stopPropagation();this.isHidden=f.hasClass("closed")},click:function(a){a.stopPropagation();"undefined"==typeof this.isHidden&&(this.isHidden=f.hasClass("closed"));this.isHidden&&(f.trigger("open"),e.ul.fix_width(f,h),e.ul.set_gravity(f),f.focus())}});a.bind("change.dropdown update.dropdown",function(){e.dropdown.update_title(h,a)});a.bind("click.dropdown",function(){h.click()})})},undo:function(){}};c.fn.dropdown=function(a){if(e[a])return e[a].apply(this,
Array.prototype.slice.call(arguments,1));if("object"!==typeof a&&a)c.error("Method "+a+" does not exist on jQuery.dropdown");else return e.init.apply(this,arguments)}})(jQuery);