From caac2b3c474958b37c3226076bb4895a2dccfa9e Mon Sep 17 00:00:00 2001 From: James Smith Date: Sat, 11 Jul 2009 16:55:02 -0700 Subject: [PATCH] Updated the plugin to version 1.1, contains many fixes suggested in comments, thanks guys\! --- src/jquery.tokeninput.js | 245 ++++++++++++++++++++++++++------------- 1 file changed, 162 insertions(+), 83 deletions(-) diff --git a/src/jquery.tokeninput.js b/src/jquery.tokeninput.js index 11d66861..7971a71a 100644 --- a/src/jquery.tokeninput.js +++ b/src/jquery.tokeninput.js @@ -1,3 +1,13 @@ +/* + * jQuery Plugin: Tokenizing Autocomplete Text Entry + * Version 1.1 + * + * Copyright (c) 2009 James Smith (http://loopj.com) + * Licensed jointly under the GPL and MIT licenses, + * choose which one suits your project best! + * + */ + (function($) { $.fn.tokenInput = function (url, options) { @@ -6,7 +16,9 @@ $.fn.tokenInput = function (url, options) { hintText: "Type in a search term", noResultsText: "No results", searchingText: "Searching...", - searchDelay: 300 + searchDelay: 300, + minChars: 1, + method: "GET" }, options); settings.classes = $.extend({ @@ -38,26 +50,29 @@ $.TokenList = function (input, settings) { AFTER: 1, END: 2 }; - + // Keys "enum" var KEY = { BACKSPACE: 8, + TAB: 9, RETURN: 13, + ESC: 27, LEFT: 37, UP: 38, RIGHT: 39, - DOWN: 40 + DOWN: 40, + COMMA: 188 }; - + // Save the tokens var saved_tokens = []; - + // Basic cache to save on db hits var cache = new $.TokenList.Cache(); // Keep track of the timeout var timeout; - + // Create a new text input an attach keyup events var input_box = $("") .css({ @@ -67,9 +82,7 @@ $.TokenList = function (input, settings) { show_dropdown_hint(); }) .blur(function () { - if(!selected_dropdown_item) { - hide_dropdown(); - } + hide_dropdown(); }) .keydown(function (event) { var previous_token; @@ -83,7 +96,7 @@ $.TokenList = function (input, settings) { if(!$(this).val()) { previous_token = input_token.prev(); next_token = input_token.next(); - + if((previous_token.length && previous_token.get(0) === selected_token) || (next_token.length && next_token.get(0) === selected_token)) { // Check if there is a previous/next token and it is selected if(event.keyCode == KEY.LEFT || event.keyCode == KEY.UP) { @@ -103,8 +116,8 @@ $.TokenList = function (input, settings) { if(event.keyCode == KEY.DOWN || event.keyCode == KEY.RIGHT) { dropdown_item = $(selected_dropdown_item).next(); - } else { - dropdown_item = $(selected_dropdown_item).prev(); + } else { + dropdown_item = $(selected_dropdown_item).prev(); } if(dropdown_item.length) { @@ -113,7 +126,7 @@ $.TokenList = function (input, settings) { return false; } break; - + case KEY.BACKSPACE: previous_token = input_token.prev(); @@ -123,30 +136,34 @@ $.TokenList = function (input, settings) { } else if(previous_token.length) { select_token($(previous_token.get(0))); } - + return false; } else if($(this).val().length == 1) { hide_dropdown(); } else { - show_dropdown_searching(); - do_search(1); + // set a timeout just long enough to let this function finish. + setTimeout(function(){do_search(false);}, 5); } break; + case KEY.TAB: case KEY.RETURN: - if(selected_dropdown_item) { - add_token($(selected_dropdown_item)); - return false; - } - break; + case KEY.COMMA: + if(selected_dropdown_item) { + add_token($(selected_dropdown_item)); + return false; + } + break; + + case KEY.ESC: + hide_dropdown(); + return true; default: if(is_printable_character(event.keyCode)) { - show_dropdown_searching(); - clearTimeout(timeout); - timeout = setTimeout(do_search, settings.searchDelay); - } - + // set a timeout just long enough to let this function finish. + setTimeout(function(){do_search(false);}, 5); + } break; } }); @@ -159,13 +176,12 @@ $.TokenList = function (input, settings) { }) .blur(function () { input_box.blur(); - }) - .val(""); + }); // Keep a reference to the selected token and dropdown item var selected_token = null; var selected_dropdown_item = null; - + // The list to store the token items in var token_list = $("