If you use KnockoutJS and want your input-fields to automatically grow and shrink with the input, use this custom handler.
<input
type="text"
data-bind="autosize: {
maxWidth: 500,
minWidth: 100,
comfortZone: 15
}"/>
ko.bindingHandlers.autosize = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
var o = $.extend({
maxWidth: 1000,
minWidth: 0,
comfortZone: 70
}, valueAccessor());
var minWidth = o.minWidth || $(element).width(),
val = '',
input = $(element),
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'
}),
check = function() {
if (val === (val = input.val())) {
return;
}
// Enter new content into testSubject
var escaped = val.replace(/&/g, '&').replace(/\s/g, ' ').replace(/</g, '<').replace(/>/g, '>');
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 < o.maxWidth);
// Animate width
if (isValidWidthChange) {
input.width(newWidth);
}
};
testSubject.insertAfter(element);
ko.utils.registerEventHandler(element, 'keyup keydown blur update', check);
}
};