diff --git a/src/jquery.autocomplete.js b/src/jquery.autocomplete.js index 8a43f12..b50d783 100644 --- a/src/jquery.autocomplete.js +++ b/src/jquery.autocomplete.js @@ -49,6 +49,7 @@ selectClass: 'acSelect', queryParamName: 'q', extraParams: {}, + xhrFields: {}, remoteDataType: false, lineSeparator: '\n', cellSeparator: '|', @@ -322,7 +323,14 @@ /** * Attach keyboard monitoring to $elem */ + $elem.keyup(function(e) { // activate when Japanese IME ends + if (e.keyCode == 13) { + self.lastKeyPressed_ = e.keyCode; + self.activate(); + } + }); $elem.keydown(function(e) { + if (e.keyCode == 229) return; // ignore inputs within Japanese IME self.lastKeyPressed_ = e.keyCode; switch(self.lastKeyPressed_) { @@ -568,6 +576,7 @@ this.dom.$elem.addClass(this.options.loadingClass); $.ajax({ url: this.makeUrl(filter), + xhrFields: self.options.xhrFields, success: ajaxCallback, error: function(jqXHR, textStatus, errorThrown) { if($.isFunction(self.options.onError)) { diff --git a/src/jquery.autocomplete.min.js b/src/jquery.autocomplete.min.js index 2996b59..d5e4cc6 100644 --- a/src/jquery.autocomplete.min.js +++ b/src/jquery.autocomplete.min.js @@ -1 +1 @@ -(function(a){"use strict",a.fn.autocomplete=function(b){var c;arguments.length>1?(c=b,b=arguments[1],b.url=c):typeof b=="string"&&(c=b,b={url:c});var d=a.extend({},a.fn.autocomplete.defaults,b);return this.each(function(){var b=a(this);b.data("autocompleter",new a.Autocompleter(b,a.meta?a.extend({},d,b.data()):d))})},a.fn.autocomplete.defaults={inputClass:"acInput",loadingClass:"acLoading",resultsClass:"acResults",selectClass:"acSelect",queryParamName:"q",extraParams:{},remoteDataType:!1,lineSeparator:"\n",cellSeparator:"|",minChars:2,maxItemsToShow:10,delay:400,useCache:!0,maxCacheLength:10,matchSubset:!0,matchCase:!1,matchInside:!0,mustMatch:!1,selectFirst:!1,selectOnly:!1,showResult:null,preventDefaultReturn:!0,preventDefaultTab:!1,autoFill:!1,filterResults:!0,sortResults:!0,sortFunction:null,onItemSelect:null,onNoMatch:null,onFinish:null,matchStringConverter:null,beforeUseConverter:null,autoWidth:"min-width",useDelimiter:!1,delimiterChar:",",delimiterKeyCode:188,processData:null,onError:null};var b=function(b){var c,d,e=typeof b;return e==="string"?(c=b,d={}):a.isArray(b)?(c=b[0],d=b.slice(1)):e==="object"&&(c=b.value,d=b.data),c=String(c),typeof d!="object"&&(d={}),{value:c,data:d}},c=function(a,b,c){var d=parseInt(a,10);c=c||{};if(isNaN(d)||c.min&&db?1:a").hide().addClass(this.options.resultsClass).css({position:"absolute"}),a("body").append(this.dom.$results),b.keydown(function(a){e.lastKeyPressed_=a.keyCode;switch(e.lastKeyPressed_){case e.options.delimiterKeyCode:e.options.useDelimiter&&e.active_&&e.selectCurrent();break;case 35:case 36:case 16:case 17:case 18:case 37:case 39:break;case 38:return a.preventDefault(),e.active_?e.focusPrev():e.activate(),!1;case 40:return a.preventDefault(),e.active_?e.focusNext():e.activate(),!1;case 9:if(e.active_){e.selectCurrent();if(e.options.preventDefaultTab)return a.preventDefault(),!1}break;case 13:if(e.active_){e.selectCurrent();if(e.options.preventDefaultReturn)return a.preventDefault(),!1}break;case 27:if(e.active_)return a.preventDefault(),e.deactivate(!0),!1;break;default:e.activate()}}),b.blur(function(){e.finishOnBlur_&&(e.finishTimeout_=setTimeout(function(){e.deactivate(!0)},200))})},a.Autocompleter.prototype.position=function(){var a=this.dom.$elem.offset();this.dom.$results.css({top:a.top+this.dom.$elem.outerHeight(),left:a.left})},a.Autocompleter.prototype.cacheRead=function(a){var b,c,d,e,f;if(this.options.useCache){a=String(a),b=a.length,this.options.matchSubset?c=1:c=b;while(c<=b){this.options.matchInside?e=b-c:e=0,f=0;while(f<=e){d=a.substr(0,c);if(this.cacheData_[d]!==undefined)return this.cacheData_[d];f++}c++}}return!1},a.Autocompleter.prototype.cacheWrite=function(a,b){return this.options.useCache?(this.cacheLength_>=this.options.maxCacheLength&&this.cacheFlush(),a=String(a),this.cacheData_[a]!==undefined&&this.cacheLength_++,this.cacheData_[a]=b,this.cacheData_[a]):!1},a.Autocompleter.prototype.cacheFlush=function(){this.cacheData_={},this.cacheLength_=0},a.Autocompleter.prototype.callHook=function(b,c){var d=this.options[b];return d&&a.isFunction(d)?d(c,this):!1},a.Autocompleter.prototype.activate=function(){var a=this;this.keyTimeout_&&clearTimeout(this.keyTimeout_),this.keyTimeout_=setTimeout(function(){a.activateNow()},this.options.delay)},a.Autocompleter.prototype.activateNow=function(){var a=this.beforeUseConverter(this.dom.$elem.val());a!==this.lastProcessedValue_&&a!==this.lastSelectedValue_&&this.fetchData(a)},a.Autocompleter.prototype.fetchData=function(a){var b=this,c=function(a,c){b.options.processData&&(a=b.options.processData(a)),b.showResults(b.filterResults(a,c),c)};this.lastProcessedValue_=a,a.length-1:e===0}return!0},a.Autocompleter.prototype.filterResults=function(a,c){var d=[],e,f;for(e=0;e0&&this.options.maxItemsToShow"+this.showResult(b.value,b.data)+"");return d.data({value:b.value,data:b.data}).click(function(){c.selectItem(d)}).mousedown(c.disableFinishOnBlur).mouseup(c.enableFinishOnBlur),d},a.Autocompleter.prototype.getItems=function(){return a(">ul>li",this.dom.$results)},a.Autocompleter.prototype.showResults=function(b,c){var d=b.length,e=this,f=a("
    "),g,h,i,j,k=!1,l=!1;if(d){for(g=0;g=d.length&&(b=d.length-1),c=a(d[b])):c=a(b),c&&c.addClass(this.selectClass_).addClass(this.options.selectClass))},a.Autocompleter.prototype.selectCurrent=function(){var b=a("li."+this.selectClass_,this.dom.$results);b.length===1?this.selectItem(b):this.deactivate(!1)},a.Autocompleter.prototype.selectItem=function(a){var b=a.data("value"),c=a.data("data"),d=this.displayValue(b,c),e=this.beforeUseConverter(d);this.lastProcessedValue_=e,this.lastSelectedValue_=e;var f=this.getDelimiterOffsets(),g=this.options.delimiterChar,h=this.dom.$elem,i=0;this.options.useDelimiter&&(h.val().substring(f.start-1,f.start)==g&&g!=" "&&(d=" "+d),h.val().substring(f.end,f.end+1)!=g&&this.lastKeyPressed_!=this.options.delimiterKeyCode?d+=g:i=1),this.setValue(d),this.setCaret(f.start+d.length+i),this.callHook("onItemSelect",{value:b,data:c}),this.deactivate(!0),h.focus()},a.Autocompleter.prototype.displayValue=function(b,c){return a.isFunction(this.options.displayValue)?this.options.displayValue(b,c):b},a.Autocompleter.prototype.hideResults=function(){this.dom.$results.hide()},a.Autocompleter.prototype.deactivate=function(a){this.finishTimeout_&&clearTimeout(this.finishTimeout_),this.keyTimeout_&&clearTimeout(this.keyTimeout_),a&&(this.lastProcessedValue_!==this.lastSelectedValue_&&(this.options.mustMatch&&this.setValue(""),this.callHook("onNoMatch")),this.active_&&this.callHook("onFinish"),this.lastKeyPressed_=null,this.lastProcessedValue_=null,this.lastSelectedValue_=null,this.active_=!1),this.hideResults()},a.Autocompleter.prototype.selectRange=function(a,b){var c=this.dom.$elem.get(0);if(c.setSelectionRange)c.focus(),c.setSelectionRange(a,b);else if(c.createTextRange){var d=c.createTextRange();d.collapse(!0),d.moveEnd("character",b),d.moveStart("character",a),d.select()}},a.Autocompleter.prototype.setCaret=function(a){this.selectRange(a,a)},a.Autocompleter.prototype.getCaret=function(){var b=this.dom.$elem;if(a.browser.msie){var c=document.selection;if(b[0].tagName.toLowerCase()!="textarea"){var d=b.val(),e=c.createRange().duplicate();e.moveEnd("character",d.length);var f=e.text==""?d.length:d.lastIndexOf(e.text);e=c.createRange().duplicate(),e.moveStart("character",-d.length);var g=e.text.length}else{var e=c.createRange(),h=e.duplicate();h.moveToElementText(b[0]),h.setEndPoint("EndToEnd",e);var f=h.text.length-e.text.length,g=f+e.text.length}}else var f=b[0].selectionStart,g=b[0].selectionEnd;return{start:f,end:g}},a.Autocompleter.prototype.setValue=function(a){if(this.options.useDelimiter){var b=this.dom.$elem.val(),c=this.getDelimiterOffsets(),d=b.substring(0,c.start),e=b.substring(c.end);a=d+a+e}this.dom.$elem.val(a)},a.Autocompleter.prototype.getValue=function(){var a=this.dom.$elem.val();if(this.options.useDelimiter){var b=this.getDelimiterOffsets();return a.substring(b.start,b.end).trim()}return a},a.Autocompleter.prototype.getDelimiterOffsets=function(){var a=this.dom.$elem.val();if(this.options.useDelimiter){var b=a.substring(0,this.getCaret().start),c=b.lastIndexOf(this.options.delimiterChar)+1,d=a.substring(this.getCaret().start),e=d.indexOf(this.options.delimiterChar);e==-1&&(e=a.length),e+=this.getCaret().start}else c=0,e=a.length;return{start:c,end:e}}})(jQuery); \ No newline at end of file +(function($){"use strict";$.fn.autocomplete=function(options){var url;if(arguments.length>1){url=options;options=arguments[1];options.url=url}else if(typeof options==="string"){url=options;options={url:url}}var opts=$.extend({},$.fn.autocomplete.defaults,options);return this.each(function(){var $this=$(this);$this.data("autocompleter",new $.Autocompleter($this,$.meta?$.extend({},opts,$this.data()):opts))})};$.fn.autocomplete.defaults={inputClass:"acInput",loadingClass:"acLoading",resultsClass:"acResults",selectClass:"acSelect",queryParamName:"q",extraParams:{},xhrFields:{},remoteDataType:false,lineSeparator:"\n",cellSeparator:"|",minChars:2,maxItemsToShow:10,delay:400,useCache:true,maxCacheLength:10,matchSubset:true,matchCase:false,matchInside:true,mustMatch:false,selectFirst:false,selectOnly:false,showResult:null,preventDefaultReturn:true,preventDefaultTab:false,autoFill:false,filterResults:true,sortResults:true,sortFunction:null,onItemSelect:null,onNoMatch:null,onFinish:null,matchStringConverter:null,beforeUseConverter:null,autoWidth:"min-width",useDelimiter:false,delimiterChar:",",delimiterKeyCode:188,processData:null,onError:null};var sanitizeResult=function(result){var value,data;var type=typeof result;if(type==="string"){value=result;data={}}else if($.isArray(result)){value=result[0];data=result.slice(1)}else if(type==="object"){value=result.value;data=result.data}value=String(value);if(typeof data!=="object"){data={}}return{value:value,data:data}};var sanitizeInteger=function(value,stdValue,options){var num=parseInt(value,10);options=options||{};if(isNaN(num)||options.min&&numb){return 1}if(a").hide().addClass(this.options.resultsClass).css({position:"absolute"});$("body").append(this.dom.$results);$elem.keyup(function(e){if(e.keyCode==13){self.lastKeyPressed_=e.keyCode;self.activate()}});$elem.keydown(function(e){if(e.keyCode==229)return;self.lastKeyPressed_=e.keyCode;switch(self.lastKeyPressed_){case self.options.delimiterKeyCode:if(self.options.useDelimiter&&self.active_){self.selectCurrent()}break;case 35:case 36:case 16:case 17:case 18:case 37:case 39:break;case 38:e.preventDefault();if(self.active_){self.focusPrev()}else{self.activate()}return false;case 40:e.preventDefault();if(self.active_){self.focusNext()}else{self.activate()}return false;case 9:if(self.active_){self.selectCurrent();if(self.options.preventDefaultTab){e.preventDefault();return false}}break;case 13:if(self.active_){self.selectCurrent();if(self.options.preventDefaultReturn){e.preventDefault();return false}}break;case 27:if(self.active_){e.preventDefault();self.deactivate(true);return false}break;default:self.activate()}});$elem.blur(function(){if(self.finishOnBlur_){self.finishTimeout_=setTimeout(function(){self.deactivate(true)},200)}})};$.Autocompleter.prototype.position=function(){var offset=this.dom.$elem.offset();this.dom.$results.css({top:offset.top+this.dom.$elem.outerHeight(),left:offset.left})};$.Autocompleter.prototype.cacheRead=function(filter){var filterLength,searchLength,search,maxPos,pos;if(this.options.useCache){filter=String(filter);filterLength=filter.length;if(this.options.matchSubset){searchLength=1}else{searchLength=filterLength}while(searchLength<=filterLength){if(this.options.matchInside){maxPos=filterLength-searchLength}else{maxPos=0}pos=0;while(pos<=maxPos){search=filter.substr(0,searchLength);if(this.cacheData_[search]!==undefined){return this.cacheData_[search]}pos++}searchLength++}}return false};$.Autocompleter.prototype.cacheWrite=function(filter,data){if(this.options.useCache){if(this.cacheLength_>=this.options.maxCacheLength){this.cacheFlush()}filter=String(filter);if(this.cacheData_[filter]!==undefined){this.cacheLength_++}this.cacheData_[filter]=data;return this.cacheData_[filter]}return false};$.Autocompleter.prototype.cacheFlush=function(){this.cacheData_={};this.cacheLength_=0};$.Autocompleter.prototype.callHook=function(hook,data){var f=this.options[hook];if(f&&$.isFunction(f)){return f(data,this)}return false};$.Autocompleter.prototype.activate=function(){var self=this;if(this.keyTimeout_){clearTimeout(this.keyTimeout_)}this.keyTimeout_=setTimeout(function(){self.activateNow()},this.options.delay)};$.Autocompleter.prototype.activateNow=function(){var value=this.beforeUseConverter(this.dom.$elem.val());if(value!==this.lastProcessedValue_&&value!==this.lastSelectedValue_){this.fetchData(value)}};$.Autocompleter.prototype.fetchData=function(value){var self=this;var processResults=function(results,filter){if(self.options.processData){results=self.options.processData(results)}self.showResults(self.filterResults(results,filter),filter)};this.lastProcessedValue_=value;if(value.length-1}else{return patternIndex===0}}return true};$.Autocompleter.prototype.filterResults=function(results,filter){var filtered=[];var i,result;for(i=0;i0&&this.options.maxItemsToShow"+this.showResult(result.value,result.data)+"");$li.data({value:result.value,data:result.data}).click(function(){self.selectItem($li)}).mousedown(self.disableFinishOnBlur).mouseup(self.enableFinishOnBlur);return $li};$.Autocompleter.prototype.getItems=function(){return $(">ul>li",this.dom.$results)};$.Autocompleter.prototype.showResults=function(results,filter){var numResults=results.length;var self=this;var $ul=$("
      ");var i,result,$li,autoWidth,first=false,$first=false;if(numResults){for(i=0;i=$items.length){item=$items.length-1}$item=$($items[item])}else{$item=$(item)}if($item){$item.addClass(this.selectClass_).addClass(this.options.selectClass)}}};$.Autocompleter.prototype.selectCurrent=function(){var $item=$("li."+this.selectClass_,this.dom.$results);if($item.length===1){this.selectItem($item)}else{this.deactivate(false)}};$.Autocompleter.prototype.selectItem=function($li){var value=$li.data("value");var data=$li.data("data");var displayValue=this.displayValue(value,data);var processedDisplayValue=this.beforeUseConverter(displayValue);this.lastProcessedValue_=processedDisplayValue;this.lastSelectedValue_=processedDisplayValue;var d=this.getDelimiterOffsets();var delimiter=this.options.delimiterChar;var elem=this.dom.$elem;var extraCaretPos=0;if(this.options.useDelimiter){if(elem.val().substring(d.start-1,d.start)==delimiter&&delimiter!=" "){displayValue=" "+displayValue}if(elem.val().substring(d.end,d.end+1)!=delimiter&&this.lastKeyPressed_!=this.options.delimiterKeyCode){displayValue=displayValue+delimiter}else{extraCaretPos=1}}this.setValue(displayValue);this.setCaret(d.start+displayValue.length+extraCaretPos);this.callHook("onItemSelect",{value:value,data:data});this.deactivate(true);elem.focus()};$.Autocompleter.prototype.displayValue=function(value,data){if($.isFunction(this.options.displayValue)){return this.options.displayValue(value,data)}return value};$.Autocompleter.prototype.hideResults=function(){this.dom.$results.hide()};$.Autocompleter.prototype.deactivate=function(finish){if(this.finishTimeout_){clearTimeout(this.finishTimeout_)}if(this.keyTimeout_){clearTimeout(this.keyTimeout_)}if(finish){if(this.lastProcessedValue_!==this.lastSelectedValue_){if(this.options.mustMatch){this.setValue("")}this.callHook("onNoMatch")}if(this.active_){this.callHook("onFinish")}this.lastKeyPressed_=null;this.lastProcessedValue_=null;this.lastSelectedValue_=null;this.active_=false}this.hideResults()};$.Autocompleter.prototype.selectRange=function(start,end){var input=this.dom.$elem.get(0);if(input.setSelectionRange){input.focus();input.setSelectionRange(start,end)}else if(input.createTextRange){var range=input.createTextRange();range.collapse(true);range.moveEnd("character",end);range.moveStart("character",start);range.select()}};$.Autocompleter.prototype.setCaret=function(pos){this.selectRange(pos,pos)};$.Autocompleter.prototype.getCaret=function(){var elem=this.dom.$elem;if($.browser.msie){var selection=document.selection;if(elem[0].tagName.toLowerCase()!="textarea"){var val=elem.val();var range=selection.createRange().duplicate();range.moveEnd("character",val.length);var s=range.text==""?val.length:val.lastIndexOf(range.text);range=selection.createRange().duplicate();range.moveStart("character",-val.length);var e=range.text.length}else{var range=selection.createRange();var stored_range=range.duplicate();stored_range.moveToElementText(elem[0]);stored_range.setEndPoint("EndToEnd",range);var s=stored_range.text.length-range.text.length;var e=s+range.text.length}}else{var s=elem[0].selectionStart;var e=elem[0].selectionEnd}return{start:s,end:e}};$.Autocompleter.prototype.setValue=function(value){if(this.options.useDelimiter){var val=this.dom.$elem.val();var d=this.getDelimiterOffsets();var preVal=val.substring(0,d.start);var postVal=val.substring(d.end);value=preVal+value+postVal}this.dom.$elem.val(value)};$.Autocompleter.prototype.getValue=function(){var val=this.dom.$elem.val();if(this.options.useDelimiter){var d=this.getDelimiterOffsets();return val.substring(d.start,d.end).trim()}else{return val}};$.Autocompleter.prototype.getDelimiterOffsets=function(){var val=this.dom.$elem.val();if(this.options.useDelimiter){var preCaretVal=val.substring(0,this.getCaret().start);var start=preCaretVal.lastIndexOf(this.options.delimiterChar)+1;var postCaretVal=val.substring(this.getCaret().start);var end=postCaretVal.indexOf(this.options.delimiterChar);if(end==-1)end=val.length;end+=this.getCaret().start}else{start=0;end=val.length}return{start:start,end:end}}})(jQuery);