We are using the autocomplete jQuery plugin written by Jörn Zaefferer, and are trying to verify a valid option is entered.
The plugin has result() event which fires
I think rather than writing your own function to verify if the data matches, you can just call search()
. If result()
is called with a null data
parameter, then you know that auto-complete wasn't used and by calling search()
on blur, you're guaranteed to get result()
called at least once.
I've posted this code for a similar question, it may help here as well.
autocompleteField.result(function(event, data, formatted) {
if (data) {
//auto-complete matched
//NB: this might get called twice, but that's okay
}
else {
//must have been triggered by search() below
//there was no match
}
});
autocompleteField.blur(function(){
autocompleteField.search(); //trigger result() on blur, even if autocomplete wasn't used
});
I use a global data structure to keep track of the values that were found
var ac_sent = {};
the .result() event handler is called before the .change() event handler, so in .result( event, data, formatted ) I add the data to the structure:
ac_sent[ data ] = true;
then in the .change( event ) event handler I check to see if there is an item at ac_sent[ data ], and if there isn't any, I know that the word was not found:
$( "#textbox" ).change( function( event ) {
var data = event.target.value;
if ( !ac_sent[ data ] ) {
// result was not found in autocomplete, do something...
ac_sent[ data ] = true; // remember that we processed it
}
return false;
});
UPDATE: This should work. I am loading the list of names into an Array called ListOfNames, this is used in the onBlur() event to verify the name entered against the data. You may need to do some tweaks, but I think it should do what you're looking for.
var listOfNames = [];
$(document).ready(function(){
$.get("fetchNames.asp", function(data){
listOfNames = data.split("\r\n");
});
$(".suggest").autocomplete("fetchNames.asp", {
matchContains:false,
minChars:1,
autoFill:false,
mustMatch:false,
cacheLength:20,
max:20
});
$("#tbxName").blur(function(){
if(!listOfNames.containsCaseInsensitive(this.value)){
alert("Invalid name entered");
}
});
});
Array.prototype.containsCaseInsensitive = function(obj) {
var i = this.length;
while (i--) {
if (this[i].toUpperCase() === obj.toUpperCase()) {
return true;
}
}
return false;
}
This is the code I have used in the past. Very clean and simple.
var availableTags = [
"ActionScript",
"AppleScript",
"Asp",
"BASIC",
"C",
"C++",
"Clojure",
"COBOL",
"ColdFusion",
"Erlang",
"Fortran",
"Groovy",
"Haskell",
"Java",
"JavaScript",
"Lisp",
"Perl",
"PHP",
"Python",
"Ruby",
"Scala",
"Scheme"
];
$( "#currentSelectedLevel" ).autocomplete({
source: availableTags,
change: function( event, ui ) {
val = $(this).val();
exists = $.inArray(val,availableTags);
if (exists<0) {
$(this).val("");
return false;
}
}
});