32 Commits
Author SHA1 Message Date
Ben Brown 73c60604f8 updated minified version 2011-11-15 11:49:36 -08:00
Ben Brown 49fc5f3ab1 fix to issue #28
https://github.com/xoxco/jQuery-Tags-Input/issues/28
onChange now receives the tag added or removed.
2011-11-15 11:41:58 -08:00
Ben Brown 5437401613 Merge branch 'autogrow-input' of http://github.com/therabidbanana/jQuery-Tags-Input into therabidbanana-autogrow-input
Conflicts:
	jquery.tagsinput.js
2011-11-15 11:35:32 -08:00
Ben Brown 55145e9390 use data[0] instead of data when using old autocompleter 2011-11-15 11:25:27 -08:00
Ben Brown 00a112153c Merge branch 'master' of github.com:xoxco/jQuery-Tags-Input 2011-11-15 11:10:35 -08:00
Ben Brown 53bce4bf40 Merge pull request #21 from cboden/master
Suggested fix for #20
2011-11-15 11:10:20 -08:00
Ben Brown 08c91e2f67 Merge branch 'master' of github.com:xoxco/jQuery-Tags-Input 2011-11-15 11:07:44 -08:00
Ben Brown b8665626c6 Merge pull request #18 from javiertoledo/master
Mark fake input as not_valid to let users style it on repeated tag
2011-11-15 11:07:34 -08:00
Ben Brown 2f564beaad Merge branch 'master' of github.com:xoxco/jQuery-Tags-Input 2011-11-15 11:05:58 -08:00
Ben Brown 0b7d62a3e1 Update README, bump version number 2011-11-15 11:05:15 -08:00
Ben Brown b7d339216d Merge pull request #17 from javiertoledo/ffac87c585a7e02b1658b628315666de33b489b1
I have addressed the Issue #15 opened by Desi-Planet and wrote a fix
2011-11-15 11:02:45 -08:00
Ben Brown fdf650de12 Merge pull request #26 from xorrizon/master
Fixed onAddTag timing bug
2011-11-15 10:59:12 -08:00
Ben Brown dcc33019ec Fix problem in importTags where tag elements were not properly removed due to missing definition of id variable 2011-11-15 09:45:28 -08:00
Xorrizon fa10428b04 Fixed a bug where the "onAddTag" callback is fired before the input field is updated 2011-09-26 15:06:24 +02:00
David Haslem 37a4fb1e8e Working autosize 2011-08-22 12:31:11 -04:00
David Haslem 53ffc5f6ed Set up initial hooks 2011-08-22 11:24:19 -04:00
Chris Boden 1cc6f5b2f8 Fixed scope bug 2011-07-28 16:18:38 -04:00
Javier Toledo 1b461629fe Mark as not_valid the fake input on repeated tag
I have added some code to add a not_valid class to the fake input to be able to stylish it when some value is repeated and I have selected the unique option.
2011-07-12 21:20:16 +01:00
Javier Toledo ffac87c585 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.
2011-07-12 21:17:30 +01:00
Sebastian Motraghi f40465718b version bump 2011-06-29 12:10:22 -05:00
Sebastian Motraghi 24832798ae added a note to the readme re: jquery.autocomplete. 2011-06-29 12:10:10 -05:00
Sebastian Motraghi af2d7d2e84 minify latest set of changes. 2011-06-29 12:09:43 -05:00
Sebastian Motraghi 683637913c Replace blur bindings with event handlers and parameters specific to the jQuery autocomplete library in use. 2011-06-29 12:06:38 -05:00
Sebastian Motraghi 22cb584ebc Version bump 2011-06-23 17:06:19 +01:00
Sebastian Motraghi bf11dcecd0 new minified version 2011-06-23 16:50:22 +01:00
Sebastian Motraghi 1c61ecd45c fake endpoints for autocomplete testing. 2011-06-23 16:39:02 +01:00
Sebastian Motraghi 6ccb7f1dff Merge branch 'master' into jaytest 2011-06-23 15:19:00 +01:00
Sebastian Motraghi bd5a63f2eb Merge remote-tracking branch 'jaylevitt/master' into jaytest 2011-06-23 14:58:27 +01:00
Jay Levitt 45fcb12091 handle autocompleteselected event properly, add placeholderColor setting 2011-06-09 11:25:50 -04:00
Maxime Corson 707bf84ee5 Add the minified version for the fix 2011-06-07 02:53:33 -07:00
Maxime Corson 7d9854a3bb Fix bug : now, when you delete the last character of a new tag, the previous tag is not removed. 2011-06-07 02:51:19 -07:00
Jay Levitt d8d8df71cf Teach tagsinput to use JQuery UI's built-in autocomplete 2011-05-27 12:38:12 -04:00
7 changed files with 185 additions and 57 deletions
+18 -3
View File
@@ -1,4 +1,4 @@
jQuery Tags Input Plugin 1.2.5
jQuery Tags Input Plugin 1.3.2
Copyright (c) 2011 XOXCO, Inc
@@ -47,7 +47,9 @@ $('#tags').tagsInput({
autocomplete_url:'http://myserver.com/api/autocomplete'
});
You can also send in options to the autocomplete plugin, as described here.
If you're using the bassistance jQuery.autocomplete, which takes extra
parameters, you can also send in options to the autocomplete plugin, as
described here.
$('#tags').tagsInput({
autocomplete_url:'http://myserver.com/api/autocomplete',
@@ -59,6 +61,18 @@ You can add and remove tags by calling the addTag() and removeTag() functions.
$('#tags').addTag('foo');
$('#tags').removeTag('bar');
You can import a list of tags using the importTags() function...
$('#tags').importTags('foo,bar,baz');
You can also use importTags() to reset the tag list...
$('#tags').importTags('');
And you can check if a tag exists using tagExist()...
if ($('#tags').tagExist('foo')) { ... }
If additional functionality is required when a tag is added or removed, you may
specify callback functions via the onAddTag and onRemoveTag parameters. Both
functions should accept a single tag as the parameter.
@@ -89,6 +103,7 @@ $(selector).tagsInput({
'onChange' : callback_function,
'removeWithBackspace' : true,
'minChars' : 0,
'maxChars' : 0 //if not provided there is no limit
'maxChars' : 0 //if not provided there is no limit,
'placeholderColor' : '#666666'
});
+1
View File
@@ -4,3 +4,4 @@ div.tagsinput span.tag a { font-weight: bold; color: #82ad2b; text-decoration:no
div.tagsinput input { width:80px; margin:0px; font-family: helvetica; font-size: 13px; border:1px solid transparent; padding:5px; background: transparent; color: #000; outline:0px; margin-right:5px; margin-bottom:5px; }
div.tagsinput div { display:block; float: left; }
.tags_clear { clear: both; width: 100%; height: 0px; }
.not_valid {background: #FBD8DB !important; color: #90111A !important;}
+138 -52
View File
@@ -1,6 +1,6 @@
/*
jQuery Tags Input Plugin 1.2.5
jQuery Tags Input Plugin 1.3.2
Copyright (c) 2011 XOXCO, Inc
@@ -18,12 +18,66 @@
var delimiter = new Array();
var tags_callbacks = new Array();
$.fn.doAutosize = function(o){
var minWidth = $(this).data('minwidth'),
maxWidth = $(this).data('maxwidth'),
val = '',
input = $(this),
testSubject = $('#'+$(this).data('tester_id'));
if (val === (val = input.val())) {return;}
// Enter new content into testSubject
var escaped = val.replace(/&/g, '&amp;').replace(/\s/g,' ').replace(/</g, '&lt;').replace(/>/g, '&gt;');
testSubject.html(escaped);
// Calculate new width + whether to change
var testerWidth = testSubject.width(),
newWidth = (testerWidth + o.comfortZone) >= minWidth ? testerWidth + o.comfortZone : minWidth,
currentWidth = input.width(),
isValidWidthChange = (newWidth < currentWidth && newWidth >= minWidth)
|| (newWidth > minWidth && newWidth < maxWidth);
// Animate width
if (isValidWidthChange) {
input.width(newWidth);
}
};
$.fn.resetAutosize = function(options){
// alert(JSON.stringify(options));
var minWidth = $(this).data('minwidth') || options.minInputWidth || $(this).width(),
maxWidth = $(this).data('maxwidth') || options.maxInputWidth || ($(this).closest('.tagsinput').width() - options.inputPadding),
val = '',
input = $(this),
testSubject = $('<tester/>').css({
position: 'absolute',
top: -9999,
left: -9999,
width: 'auto',
fontSize: input.css('fontSize'),
fontFamily: input.css('fontFamily'),
fontWeight: input.css('fontWeight'),
letterSpacing: input.css('letterSpacing'),
whiteSpace: 'nowrap'
}),
testerId = $(this).attr('id')+'_autosize_tester';
if(! $('#'+testerId).length > 0){
testSubject.attr('id', testerId);
testSubject.appendTo('body');
}
input.data('minwidth', minWidth);
input.data('maxwidth', maxWidth);
input.data('tester_id', testerId);
input.css('width', minWidth);
};
$.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] == '') {
tagslist = new Array();
@@ -32,11 +86,15 @@
value = jQuery.trim(value);
if (options.unique) {
skipTag = $(tagslist).tagExist(value);
var skipTag = $(tagslist).tagExist(value);
if(skipTag == true) {
//Marks fake input as not_valid to let styling it
$('#'+id+'_tag').addClass('not_valid');
}
} else {
skipTag = false;
var skipTag = false;
}
if (value !='' && skipTag != true) {
$('<span>').addClass('tag').append(
$('<span>').text(value).append('&nbsp;&nbsp;'),
@@ -58,18 +116,19 @@
$('#'+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);
f.call(this, value);
}
if(tags_callbacks[id] && tags_callbacks[id]['onChange'])
{
var i = tagslist.length;
var f = tags_callbacks[id]['onChange'];
f($(this), tagslist[i]);
f.call(this, $(this), tagslist[i-1]);
}
}
$.fn.tagsInput.updateTagsField(this,tagslist);
});
@@ -79,11 +138,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++) {
@@ -96,7 +154,7 @@
if (tags_callbacks[id] && tags_callbacks[id]['onRemoveTag']) {
var f = tags_callbacks[id]['onRemoveTag'];
f(value);
f.call(this, value);
}
});
@@ -104,30 +162,42 @@
};
$.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
$.fn.importTags = function(str) {
id = $(this).attr('id');
$('#'+id+'_tagsinput .tag').remove();
$.fn.tagsInput.importTags(this,str);
}
$.fn.tagsInput = function(options) {
var settings = jQuery.extend({interactive:true,defaultText:'add a tag',minChars:0,width:'300px',height:'100px','hide':true,'delimiter':',',autocomplete:{selectFirst:false},'unique':true,removeWithBackspace:true},options);
var settings = jQuery.extend({
interactive:true,
defaultText:'add a tag',
minChars:0,
width:'300px',
height:'100px',
autocomplete: {selectFirst: false },
'hide':true,
'delimiter':',',
'unique':true,
removeWithBackspace:true,
placeholderColor:'#666666',
autosize: true,
comfortZone: 20,
inputPadding: 6*2,
},options);
this.each(function() {
if (settings.hide) {
$(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',
@@ -135,7 +205,6 @@
fake_input: '#'+id+'_tag'
},settings);
delimiter[id] = data.delimiter;
if (settings.onAddTag || settings.onRemoveTag || settings.onChange) {
@@ -163,7 +232,8 @@
}
if (settings.interactive) {
$(data.fake_input).val($(data.fake_input).attr('data-default'));
$(data.fake_input).css('color','#666666');
$(data.fake_input).css('color',settings.placeholderColor);
$(data.fake_input).resetAutosize(settings);
$(data.holder).bind('click',data,function(event) {
$(event.data.fake_input).focus();
@@ -177,25 +247,27 @@
});
if (settings.autocomplete_url != undefined) {
$(data.fake_input).autocomplete(settings.autocomplete_url,settings.autocomplete).bind('result',data,function(event,data,formatted) {
if (data)
{
$(event.data.real_input).addTag(formatted,{focus:true,unique:(settings.unique)});
}
});
autocomplete_options = {source: settings.autocomplete_url};
for (attrname in settings.autocomplete) {
autocomplete_options[attrname] = settings.autocomplete[attrname];
}
if (jQuery.Autocompleter !== undefined) {
$(data.fake_input).autocomplete(settings.autocomplete_url, settings.autocomplete);
$(data.fake_input).bind('result',data,function(event,data,formatted) {
if (data) {
$('#'+id).addTag(data[0] + "",{focus:true,unique:(settings.unique)});
}
});
} else if (jQuery.ui.autocomplete !== undefined) {
$(data.fake_input).autocomplete(autocomplete_options);
$(data.fake_input).bind('autocompleteselect',data,function(event,ui) {
$(event.data.real_input).addTag(ui.item.value,{focus:true,unique:(settings.unique)});
return false;
});
}
$(data.fake_input).bind('blur',data,function(event) {
if( $('.ac_results').is(':visible') ) return false;
if ( $(event.data.fake_input).val() != $(event.data.fake_input).attr('data-default')) {
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:false,unique:(settings.unique)});
}
$(event.data.fake_input).val($(event.data.fake_input).attr('data-default'));
$(event.data.fake_input).css('color','#666666');
return false;
});
} else {
// if a user tabs out of the field, create a new tag
// this is only available if autocomplete is not used.
@@ -206,34 +278,48 @@
$(event.data.real_input).addTag($(event.data.fake_input).val(),{focus:true,unique:(settings.unique)});
} else {
$(event.data.fake_input).val($(event.data.fake_input).attr('data-default'));
$(event.data.fake_input).css('color','#666666');
$(event.data.fake_input).css('color',settings.placeholderColor);
}
return false;
});
}
// 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)});
$(event.data.fake_input).resetAutosize(settings);
return false;
}
} else if (event.data.autosize) {
$(event.data.fake_input).doAutosize(settings);
}
});
//Delete last tag on backspace
data.removeWithBackspace && $(data.fake_input).bind('keyup', function(event)
data.removeWithBackspace && $(data.fake_input).bind('keydown', function(event)
{
if(event.keyCode == 8 && $(this).val() == '')
{
event.preventDefault();
var last_tag = $(this).closest('.tagsinput').find('.tag:last').text();
var id = $(this).attr('id').replace(/_tag$/, '');
last_tag = last_tag.replace(/[\s]+x$/, '');
$('#' + id).removeTag(escape(last_tag));
$(this).trigger('focus');
};
}
});
$(data.fake_input).blur();
//Removes the not_valid class when user changes the value of the fake input
if(data.unique) {
$(data.fake_input).keydown(function(event){
if(event.keyCode == 8 || String.fromCharCode(event.which).match(/\w+|[áéíóúÁÉÍÓÚñÑ,/]+/)) {
$(this).removeClass('not_valid');
}
});
}
} // if settings.interactive
return false;
});
@@ -243,13 +329,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<tags.length; i++) {
$(obj).addTag(tags[i],{focus:false,callback:false});
@@ -257,7 +343,7 @@
if(tags_callbacks[id] && tags_callbacks[id]['onChange'])
{
var f = tags_callbacks[id]['onChange'];
f(obj, tags[i]);
f.call(obj, obj, tags[i]);
}
};
+1 -1
View File
File diff suppressed because one or more lines are too long
+22 -1
View File
@@ -7,6 +7,13 @@
<link rel="stylesheet" type="text/css" href="jquery.tagsinput.css" />
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<script type="text/javascript" src="jquery.tagsinput.js"></script>
<!-- To test using the original jQuery.autocomplete, uncomment the following -->
<!--
<script type='text/javascript' src='http://xoxco.com/x/tagsinput/jquery-autocomplete/jquery.autocomplete.min.js'></script>
<link rel="stylesheet" type="text/css" href="http://xoxco.com/x/tagsinput/jquery-autocomplete/jquery.autocomplete.css" />
-->
<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js'></script>
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/themes/start/jquery-ui.css" />
<script type="text/javascript">
@@ -18,7 +25,12 @@
alert("Removed a tag: " + tag);
}
function onChangeTag(input,tag) {
alert("Changed a tag: " + tag);
}
$(function() {
$('#tags_1').tagsInput();
$('#tags_2').tagsInput({
onChange: function(elem, elem_tags)
@@ -31,9 +43,14 @@
});
}
});
$('#tags_3').tagsInput({
//autocomplete_url:'test/fake_plaintext_endpoint.html' //jquery.autocomplete (not jquery ui)
autocomplete_url:'test/fake_json_endpoint.html' // jquery ui autocomplete requires a json endpoint
});
// Uncomment this line to see the callback functions in action
// $('input.tags').tagsInput({onAddTag:onAddTag,onRemoveTag:onRemoveTag});
// $('input.tags').tagsInput({onAddTag:onAddTag,onRemoveTag:onRemoveTag,onChange: onChangeTag});
// Uncomment this line to see an input with no interface for adding new tags.
// $('input.tags').tagsInput({interactive:false});
@@ -52,6 +69,10 @@
<label>Technologies: (Programming languages in yellow)</label>
<input id="tags_2" type="text" class="tags" value="php,ios,javascript,ruby,android,kindle" />
<label>Autocomplete:</label>
<input id='tags_3' type='text' class='tags'>
</form>
</section>
+1
View File
@@ -0,0 +1 @@
[ { "id": "Netta rufina", "label": "Red-crested Pochard", "value": "Red-crested Pochard" }, { "id": "Sterna sandvicensis", "label": "Sandwich Tern", "value": "Sandwich Tern" }, { "id": "Saxicola rubetra", "label": "Whinchat", "value": "Whinchat" }, { "id": "Saxicola rubicola", "label": "European Stonechat", "value": "European Stonechat" }, { "id": "Lanius senator", "label": "Woodchat Shrike", "value": "Woodchat Shrike" }, { "id": "Coccothraustes coccothraustes", "label": "Hawfinch", "value": "Hawfinch" }, { "id": "Ficedula hypoleuca", "label": "Eurasian Pied Flycatcher", "value": "Eurasian Pied Flycatcher" }, { "id": "Sitta europaea", "label": "Eurasian Nuthatch", "value": "Eurasian Nuthatch" }, { "id": "Pyrrhula pyrrhula", "label": "Eurasian Bullfinch", "value": "Eurasian Bullfinch" }, { "id": "Muscicapa striata", "label": "Spotted Flycatcher", "value": "Spotted Flycatcher" }, { "id": "Carduelis chloris", "label": "European Greenfinch", "value": "European Greenfinch" }, { "id": "Carduelis carduelis", "label": "European Goldfinch", "value": "European Goldfinch" } ]
+4
View File
@@ -0,0 +1,4 @@
inky
pinky
blinky
clyde