-
Notifications
You must be signed in to change notification settings - Fork 181
Expand file tree
/
Copy pathauto-complete.min.js
More file actions
3 lines (3 loc) · 5.36 KB
/
auto-complete.min.js
File metadata and controls
3 lines (3 loc) · 5.36 KB
1
2
3
// JavaScript autoComplete v1.0.4
// https://github.com/Pixabay/JavaScript-autoComplete
var autoComplete=function(){return function(e){if(document.querySelector){var t={selector:0,source:0,minChars:3,delay:150,offsetLeft:0,offsetTop:1,cache:1,menuClass:"",invertScroll:!1,parentElementId:"body",renderItem:function(e,t){t=t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&");var o=new RegExp("("+t.split(" ").join("|")+")","gi");return'<div class="autocomplete-suggestion" data-val="'+e+'">'+e.replace(o,"<b>$1</b>")+"</div>"},onSelect:function(e,t,o){}};for(var o in e)e.hasOwnProperty(o)&&(t[o]=e[o]);for(var s="object"==typeof t.selector?[t.selector]:document.querySelectorAll(t.selector),l=0;l<s.length;l++){var n=s[l],c=document.getElementById(t.parentElementId);n.sc=document.createElement("div"),n.sc.className="autocomplete-suggestions "+t.menuClass,n.autocompleteAttr=n.getAttribute("autocomplete"),n.setAttribute("autocomplete","off"),n.cache={},n.last_val="",n.updateSC=function(e,o){var s=n.getBoundingClientRect();if(n.sc.style.left=Math.round(s.left+(window.pageXOffset||document.documentElement.scrollLeft)+t.offsetLeft)+"px",n.sc.style.top=Math.round(s.bottom+(window.pageYOffset||document.documentElement.scrollTop)+t.offsetTop)+"px",n.sc.style.width=Math.round(s.right-s.left)+"px",!e&&(n.sc.style.display="block",n.sc.maxHeight||(n.sc.maxHeight=parseInt((window.getComputedStyle?getComputedStyle(n.sc,null):n.sc.currentStyle).maxHeight)),n.sc.suggestionHeight||(n.sc.suggestionHeight=n.sc.querySelector(".autocomplete-suggestion").offsetHeight),n.sc.suggestionHeight))if(o||t.invertScroll)if(t.invertScroll)n.sc.scrollHeight>n.sc.maxHeight&&(n.sc.scrollTop=n.sc.scrollHeight);else{var l=n.sc.scrollTop,c=o.getBoundingClientRect().top-n.sc.getBoundingClientRect().top;c+n.sc.suggestionHeight-n.sc.maxHeight>0?n.sc.scrollTop=c+n.sc.suggestionHeight+l-n.sc.maxHeight:c<0&&(n.sc.scrollTop=c+l)}else n.sc.scrollTop=0},i(window,"resize",n.updateSC),c.appendChild(n.sc),d("autocomplete-suggestion","mouseleave",function(e){var t=n.sc.querySelector(".autocomplete-suggestion.selected");t&&setTimeout(function(){t.className=t.className.replace("selected","")},20)},n.sc),d("autocomplete-suggestion","mouseover",function(e){var t=n.sc.querySelector(".autocomplete-suggestion.selected");t&&(t.className=t.className.replace("selected","")),this.className+=" selected"},n.sc),d("autocomplete-suggestion","mousedown",function(e){if(u(this,"autocomplete-suggestion")){var o=this.getAttribute("data-val");n.value=o,t.onSelect(e,o,this),n.sc.style.display="none"}},n.sc),n.blurHandler=function(){try{var e=document.querySelector(".autocomplete-suggestions:hover")}catch(t){e=0}e?n!==document.activeElement&&setTimeout(function(){n.focus()},20):(n.last_val=n.value,n.sc.style.display="none",setTimeout(function(){n.sc.style.display="none"},350))},i(n,"blur",n.blurHandler);var a=function(e){var o=n.value;if(n.cache[o]=e,e.length&&o.length>=t.minChars){for(var s="",l=0;l<e.length;l++)s+=t.renderItem(e[l],o);n.sc.innerHTML=s,n.updateSC(0)}else n.sc.style.display="none"};n.keydownHandler=function(e){var o,s=window.event?e.keyCode:e.which;if((40==s||38==s)&&n.sc.innerHTML)return(l=n.sc.querySelector(".autocomplete-suggestion.selected"))?(o=40==s?l.nextSibling:l.previousSibling)?(l.className=l.className.replace("selected",""),o.className+=" selected",n.value=o.getAttribute("data-val")):(l.className=l.className.replace("selected",""),n.value=n.last_val,o=0):((o=40==s?n.sc.querySelector(".autocomplete-suggestion"):n.sc.childNodes[n.sc.childNodes.length-1]).className+=" selected",n.value=o.getAttribute("data-val")),n.updateSC(0,o),!1;if(27==s)n.value=n.last_val,n.sc.style.display="none";else if(13==s||9==s){var l;(l=n.sc.querySelector(".autocomplete-suggestion.selected"))&&"none"!=n.sc.style.display&&(t.onSelect(e,l.getAttribute("data-val"),l),setTimeout(function(){n.sc.style.display="none"},20))}},i(n,"keydown",n.keydownHandler),n.keyupHandler=function(e){var o=window.event?e.keyCode:e.which;if(!o||(o<35||o>40)&&13!=o&&27!=o){var s=n.value;if(s.length>=t.minChars){if(s!=n.last_val){if(n.last_val=s,clearTimeout(n.timer),t.cache){if(s in n.cache)return void a(n.cache[s]);for(var l=1;l<s.length-t.minChars;l++){var c=s.slice(0,s.length-l);if(c in n.cache&&!n.cache[c].length)return void a([])}}n.timer=setTimeout(function(){t.source(s,a)},t.delay)}}else n.last_val=s,n.sc.style.display="none"}},i(n,"keyup",n.keyupHandler),n.focusHandler=function(e){n.last_val="\n",n.keyupHandler(e)},t.minChars||i(n,"focus",n.focusHandler)}this.destroy=function(){for(var e=0;e<s.length;e++){var t=s[e];r(window,"resize",t.updateSC),r(t,"blur",t.blurHandler),r(t,"focus",t.focusHandler),r(t,"keydown",t.keydownHandler),r(t,"keyup",t.keyupHandler),t.autocompleteAttr?t.setAttribute("autocomplete",t.autocompleteAttr):t.removeAttribute("autocomplete"),document.body.removeChild(t.sc),t=null}}}function u(e,t){return e.classList?e.classList.contains(t):new RegExp("\\b"+t+"\\b").test(e.className)}function i(e,t,o){e.attachEvent?e.attachEvent("on"+t,o):e.addEventListener(t,o)}function r(e,t,o){e.detachEvent?e.detachEvent("on"+t,o):e.removeEventListener(t,o)}function d(e,t,o,s){i(s||document,t,function(t){for(var s,l=t.target||t.srcElement;l&&!(s=u(l,e));)l=l.parentElement;s&&o.call(l,t)})}}}();"function"==typeof define&&define.amd?define("autoComplete",function(){return autoComplete}):"undefined"!=typeof module&&module.exports?module.exports=autoComplete:window.autoComplete=autoComplete;