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