jQuery plugin providing a Twitter Bootstrap user interface for managing tags
Code on Github Bootstrap 2.3.2 Download
Just add data-role="tagsinput" to your input field to automatically change it to a tags input field.
<input type="text" value="Amsterdam,Washington,Sydney,Beijing,Cairo" data-role="tagsinput" />
                | statement | returns | 
|---|---|
$("input").val() |  | 
$("input").tagsinput('items') |  | 
            Use a <select multiple /> as your input element for a tags input, to gain true multivalue support. Instead of a comma separated string, the values will be set in an array. Existing <option /> elements will automatically be set as tags. This makes it also possible to create tags containing a comma.
          
<select multiple data-role="tagsinput">
  <option value="Amsterdam">Amsterdam</option>
  <option value="Washington">Washington</option>
  <option value="Sydney">Sydney</option>
  <option value="Beijing">Beijing</option>
  <option value="Cairo">Cairo</option>
</select>
                | statement | returns | 
|---|---|
$("select").val() |  | 
$("select").tagsinput('items') |  | 
<input type="text" value="Amsterdam,Washington" data-role="tagsinput" />
<script>
var citynames = new Bloodhound({
  datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'),
  queryTokenizer: Bloodhound.tokenizers.whitespace,
  prefetch: {
    url: 'assets/citynames.json',
    filter: function(list) {
      return $.map(list, function(cityname) {
        return { name: cityname }; });
    }
  }
});
citynames.initialize();
$('input').tagsinput({
  typeaheadjs: {
    name: 'citynames',
    displayKey: 'name',
    valueKey: 'name',
    source: citynames.ttAdapter()
  }
});
</script>
                | statement | returns | 
|---|---|
$("input").val() |  | 
$("input").tagsinput('items') |  | 
You can set a fixed css class for your tags, or determine dynamically by providing a custom function.
<input type="text" />
<script>
var cities = new Bloodhound({
  datumTokenizer: Bloodhound.tokenizers.obj.whitespace('text'),
  queryTokenizer: Bloodhound.tokenizers.whitespace,
  prefetch: 'assets/cities.json'
});
cities.initialize();
var elt = $('input');
elt.tagsinput({
  tagClass: function(item) {
    switch (item.continent) {
      case 'Europe'   : return 'label label-primary';
      case 'America'  : return 'label label-danger label-important';
      case 'Australia': return 'label label-success';
      case 'Africa'   : return 'label label-default';
      case 'Asia'     : return 'label label-warning';
    }
  },
  itemValue: 'value',
  itemText: 'text',
  typeaheadjs: {
    name: 'cities',
    displayKey: 'text',
    source: cities.ttAdapter()
  }
});
elt.tagsinput('add', { "value": 1 , "text": "Amsterdam"   , "continent": "Europe"    });
elt.tagsinput('add', { "value": 4 , "text": "Washington"  , "continent": "America"   });
elt.tagsinput('add', { "value": 7 , "text": "Sydney"      , "continent": "Australia" });
elt.tagsinput('add', { "value": 10, "text": "Beijing"     , "continent": "Asia"      });
elt.tagsinput('add', { "value": 13, "text": "Cairo"       , "continent": "Africa"    });
</script>
                | statement | returns | 
|---|---|
$("input").val() |  | 
$("input").tagsinput('items') |  | 
| option | description | |
|---|---|---|
tagClass | 
              
                 Classname for the tags, or a function returning a classname 
                
               | 
            |
itemValue | 
              
                 When adding objects as tags, itemValue must be set to the name of the property containing the item's value, or a function returning an item's value. 
                
               | 
            |
itemText | 
              
                 When adding objects as tags, you can set itemText to the name of the property of item to use for a its tag's text. You may also provide a function which returns an item's value. When this options is not set, the value of  
                
               | 
            |
confirmKeys | 
              
                 Array of keycodes which will add a tag when typing in the input. (default: [13, 188], which are ENTER and comma) 
               | 
            |
maxTags | 
              
                 When set, no more than the given number of tags are allowed to add (default: undefined). When maxTags is reached, a class 'bootstrap-tagsinput-max' is placed on the tagsinput element. 
               | 
            |
maxChars | 
              
                 Defines the maximum length of a single tag. (default: undefined) 
               | 
            |
trimValue | 
              
                 When true, automatically removes all whitespace around tags. (default: false) 
               | 
            |
allowDuplicates | 
              
                 When true, the same tag can be added multiple times. (default: false) 
               | 
            |
freeInput | 
              
                 Allow creating tags which are not returned by typeahead's source (default: true) 
                    This is only possible when using string as tags. When itemValue option is set, this option will be ignored.
                 
                
               | 
            |
typeahead | 
              Object containing typeahead specific options  | 
            |
source | 
              
                 An array (or function returning a promise or array), which will be used as source for a typeahead. 
                
               | 
            |
cancelConfirmKeysOnEmpty | 
              Boolean value controlling whether form submissions get processed when pressing enter in a field converted to a tagsinput (default: false). 
               | 
            |
onTagExists | 
              Function invoked when trying to add an item which allready exists. By default, the existing tag hides and fades in. 
               | 
            |
| method | description | 
|---|---|
add | 
              
                 Adds a tag 
                
                Optionally, you can pass a 3rd parameter (object or value) to the add method to gain more control over the process. The parameter is exposed in the options attribute of the event.
                
                Usage:
                
                  
               | 
            
remove | 
              
                 Removes a tag 
                
                Optionally, you can pass a 3rd parameter (object or value) to the remove method to gain more control over the process. The parameter is exposed in the options attribute of the event.
                
                Usage:
                
                  
               | 
            
removeAll | 
              
                 Removes all tags 
               | 
            
focus | 
              
                 Sets focus in the tagsinput 
               | 
            
input | 
              
                 Returns the tagsinput's internal <input />, which is used for adding tags. You could use this to add your own typeahead behaviour for example. 
               | 
            
refresh | 
              
                 Refreshes the tags input UI. This might be usefull when you're adding objects as tags. When an object's text changes, you'll have to refresh to update the matching tag's text. 
               | 
            
destroy | 
              
                 Removes tagsinput behaviour 
               | 
            
| event | description | 
|---|---|
itemAddedOnInit | 
              
                During initialization, pre-defined tags being added will cause this event to be triggered. Example:
                
               | 
            
beforeItemAdd | 
              
                Triggered just before an item gets added. Example:
                
               | 
            
itemAdded | 
              
                Triggered just after an item got added. Example:
                
               | 
            
beforeItemRemove | 
              
                Triggered just before an item gets removed. Example:
                
               | 
            
itemRemoved | 
              
                Triggered just after an item got removed. Example:
                
               |