From ffac87c585a7e02b1658b628315666de33b489b1 Mon Sep 17 00:00:00 2001 From: Javier Toledo Date: Tue, 12 Jul 2011 21:17:30 +0100 Subject: [PATCH 1/2] Fixed a bug when creating multiple tags-input in same page Some variables used global scope, so each new instance of tagsInput overwrite them with its own values. I have also added a preventDefault to the fake_input keypress event as I had some form submitting issues when using the plugin and "Optimized" the tagExist method. --- jquery.tagsinput.js | 41 ++++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/jquery.tagsinput.js b/jquery.tagsinput.js index ecd7ed3..f1dcd12 100644 --- a/jquery.tagsinput.js +++ b/jquery.tagsinput.js @@ -20,9 +20,9 @@ var tags_callbacks = new Array(); $.fn.addTag = function(value,options) { - var options = jQuery.extend({focus:false,callback:true},options); + options = jQuery.extend({focus:false,callback:true},options); this.each(function() { - id = $(this).attr('id'); + var id = $(this).attr('id'); var tagslist = $(this).val().split(delimiter[id]); if (tagslist[0] == '') { @@ -32,11 +32,11 @@ value = jQuery.trim(value); if (options.unique) { - skipTag = $(tagslist).tagExist(value); + var skipTag = $(tagslist).tagExist(value); } else { - skipTag = false; + var skipTag = false; } - + if (value !='' && skipTag != true) { $('').addClass('tag').append( $('').text(value).append('  '), @@ -79,11 +79,10 @@ $.fn.removeTag = function(value) { value = unescape(value); this.each(function() { - id = $(this).attr('id'); + var id = $(this).attr('id'); var old = $(this).val().split(delimiter[id]); - - + $('#'+id+'_tagsinput .tag').remove(); str = ''; for (i=0; i< old.length; i++) { @@ -104,11 +103,7 @@ }; $.fn.tagExist = function(val) { - if (jQuery.inArray(val, $(this)) == -1) { - return false; /* Cannot find value in array */ - } else { - return true; /* Value found */ - } + return (jQuery.inArray(val, $(this)) >= 0); //true when tag exists, false when not }; // clear all existing tags and import new ones from a string @@ -137,9 +132,9 @@ $(this).hide(); } - id = $(this).attr('id') + var id = $(this).attr('id') - data = jQuery.extend({ + var data = jQuery.extend({ pid:id, real_input: '#'+id, holder: '#'+id+'_tagsinput', @@ -147,7 +142,6 @@ fake_input: '#'+id+'_tag' },settings); - delimiter[id] = data.delimiter; if (settings.onAddTag || settings.onRemoveTag || settings.onChange) { @@ -198,8 +192,7 @@ $(data.fake_input).autocomplete(settings.autocomplete_url, settings.autocomplete); $(data.fake_input).bind('result',data,function(event,data,formatted) { if (data) { - d = data + ""; - $(event.data.real_input).addTag(d,{focus:true,unique:(settings.unique)}); + $('#'+id).addTag(data + "",{focus:true,unique:(settings.unique)}); } }); } else if (jQuery.ui.autocomplete !== undefined) { @@ -228,11 +221,12 @@ } // if user types a comma, create a new tag - $(data.fake_input).bind('keypress',data,function(event) { + $(data.fake_input).bind('keypress',data,function(event) { if (event.which==event.data.delimiter.charCodeAt(0) || event.which==13 ) { + event.preventDefault(); if( (event.data.minChars <= $(event.data.fake_input).val().length) && (!event.data.maxChars || (event.data.maxChars >= $(event.data.fake_input).val().length)) ) $(event.data.real_input).addTag($(event.data.fake_input).val(),{focus:true,unique:(settings.unique)}); - + return false; } }); @@ -247,9 +241,10 @@ last_tag = last_tag.replace(/[\s]+x$/, ''); $('#' + id).removeTag(escape(last_tag)); $(this).trigger('focus'); - }; + } }); $(data.fake_input).blur(); + } // if settings.interactive return false; }); @@ -259,13 +254,13 @@ }; $.fn.tagsInput.updateTagsField = function(obj,tagslist) { - id = $(obj).attr('id'); + var id = $(obj).attr('id'); $(obj).val(tagslist.join(delimiter[id])); }; $.fn.tagsInput.importTags = function(obj,val) { $(obj).val(''); - id = $(obj).attr('id'); + var id = $(obj).attr('id'); var tags = val.split(delimiter[id]); for (i=0; i Date: Mon, 26 Sep 2011 15:06:24 +0200 Subject: [PATCH 2/2] Fixed a bug where the "onAddTag" callback is fired before the input field is updated --- jquery.tagsinput.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jquery.tagsinput.js b/jquery.tagsinput.js index ecd7ed3..ed24242 100644 --- a/jquery.tagsinput.js +++ b/jquery.tagsinput.js @@ -58,6 +58,8 @@ $('#'+id+'_tag').blur(); } + $.fn.tagsInput.updateTagsField(this,tagslist); + if (options.callback && tags_callbacks[id] && tags_callbacks[id]['onAddTag']) { var f = tags_callbacks[id]['onAddTag']; f(value); @@ -69,7 +71,6 @@ f($(this), tagslist[i]); } } - $.fn.tagsInput.updateTagsField(this,tagslist); });