-
-
Save fat/2411033 to your computer and use it in GitHub Desktop.
!function ($) { | |
"use strict"; // jshint ;_; | |
/* TOKENAHEAD PUBLIC CLASS DEFINITION | |
* ================================== */ | |
var Tokenahead = function (element, options) { | |
this.$wrapper = $(element) | |
this.$measurer = $('.measurer', this.$wrapper) | |
this.$tokens = $('.tokens', this.$wrapper) | |
$.fn.typeahead.Constructor.call(this, $('input', this.$wrapper), options) | |
} | |
Tokenahead.prototype = $.extend({}, $.fn.typeahead.Constructor.prototype, { | |
constructor: Tokenahead | |
, updater: function (item) { | |
this.addToken(item) | |
return '' | |
} | |
, addToken: function (item) { | |
var token = $(this.options.token) | |
, text = $('<span></span>').text(item).appendTo(token) | |
token.appendTo(this.$tokens) | |
} | |
, listen: function () { | |
var that = this | |
$.fn.typeahead.Constructor.prototype.listen.call(this) | |
this.$wrapper | |
.on('click', 'a', function (e) { | |
e.stopPropagation() | |
}) | |
.on('click', '.close', function (e) { | |
$(this).parent().remove() | |
}) | |
.on('click', function () { | |
that.$element.focus() | |
}) | |
this.$element | |
.on('focus', function (e) { | |
if (!that.$element.val()) return that.isEmpty = true | |
}) | |
.on('keyup', function (e) { | |
var tokens | |
, value | |
if (e.keyCode == 13 && !that.shown && (value = that.$element.val())) { //enter with no menu and val | |
that.$element | |
.val('') | |
.change() | |
that.addToken(value) | |
return that.$element.focus() | |
} | |
if (e.keyCode != 8 || that.$element.val()) return that.isEmpty = false//backspace | |
if (!that.isEmpty) return that.isEmpty = true | |
tokens = $('a', that.$wrapper) | |
if (!tokens.length) return | |
tokens.last().remove() | |
}) | |
.on('keypress keydown paste', function () { | |
var value = that.$element.val() | |
that.$measurer.text(value) | |
that.$element.css('width', that.$measurer.width() + 30) | |
}) | |
} | |
}) | |
/* TOKENAHEAD PLUGIN DEFINITION | |
* ============================ */ | |
$.fn.tokenahead = function (option) { | |
return this.each(function () { | |
var $this = $(this) | |
, data = $this.data('tokenahead') | |
, options = typeof option == 'object' && option | |
if (!data) $this.data('tokenahead', (data = new Tokenahead(this, options))) | |
if (typeof option == 'string') data[option]() | |
}) | |
} | |
$.fn.tokenahead.Constructor = Tokenahead | |
$.fn.tokenahead.defaults = $.extend({} , $.fn.typeahead.defaults, { | |
token: '<a><button class="close">×</button></a>' | |
}) | |
}(window.jQuery) |
<!-- markup --> | |
<div class="input-xlarge uneditable-input tokenahead"> | |
<div class="measurer"></div> | |
<div class="tokens"></div> | |
<input type="text"> | |
</div> | |
<script> | |
$(function () { | |
$('.tokenahead').tokenahead({ | |
items: 4 | |
, source: ["fat","mdo","dhg"] | |
}) | |
}) | |
</script> |
// Tokenahead.less | |
// --------------- | |
.tokenahead { | |
cursor: text; | |
overflow: hidden; | |
height: auto; | |
padding-bottom: 0; | |
border-color: @inputBorder; | |
} | |
.tokenahead a { | |
cursor: default; | |
float: left; | |
display: inline-block; | |
border: 1px solid @inputBorder; | |
text-decoration: none; | |
padding: 0 4px; | |
margin: 0 3px 3px 0; | |
.border-radius(@inputBorderRadius); | |
} | |
.tokenahead a:hover { | |
color: @linkColor; | |
} | |
.tokenahead button.close { | |
font-size: 14px; | |
line-height: 14px; | |
margin-left: 4px; | |
} | |
.tokenahead .measurer { | |
position: absolute; | |
top: -1000px; | |
} | |
.tokenahead input { | |
border: none; | |
box-shadow: none; | |
float: left; | |
margin: 0 0 5px; | |
padding: 0; | |
width: 30px; | |
} |
I am trying to create a subclass to add in custom updater functions but like you are adding token to the defaults I am trying to add something similar. I am not seeing where you are adding the new defaults to the plugin. I see you extended $.fn.tokenahead.defaults but from your code I don't see how you could access it with this.options.token. It has not been added to the object.
I was modeling off of your code here but then noticed the {} was preventing the extending of the the $.fn.typeahead.defaults so I removed that and all worked.
Thanks @fat for this code
Thanks @dantuck for your comment about removing {}
$.fn.tokenahead.defaults = $.extend({} , $.fn.typeahead.defaults, { token: '<a><button class="close">×</button></a>' })
becoming
$.fn.tokenahead.defaults = $.extend($.fn.typeahead.defaults, { token: '<a><button class="close">×</button></a>' })
I made a fork with following additions :
- a cloned input is created so that original input can store and keep up with tags values
- a comma trigger a new tag while typing
- some css changes
https://gist.github.com/4354488
it was for my own use, but if it can be usefull to anyone...
Somehow I can't get this to work with Bootstrap 2.1 and can't figure out where the data gets lost, the token fields don't get updated upon selection. I guess this typeahead plugin doesn't work nicely with the updated typeahead?