Ух, отладка этого заняла много времени, я думаю, вы должны использовать метод val вместо использования атрибута 'value'.
В любом случае, проблемная строка в этом
$(this).attr('value', hvalue).addClass(opts.hclass).unbind('focus blur').bind('focus',
В приведенной выше строке, когда вы присваиваете атрибут «значение», вы фактически изменяете значение текстового поля.
Вы должны изменить его, только если он не пустой.
Я немного изменил ваш код, чтобы везде использовать метод val (), и он работает, как вы ожидали.
Рабочая демоверсия: http://jsbin.com/ihegu/
[Обратите внимание, как демо правильно отображает текст «Википедии», когда вы что-то ищете в Google, и нажимаете кнопку «Назад».]
(function($) {
$.fn.inputdynvalue = function(options)
{
var opts = $.extend({},
$.fn.inputdynvalue.defaults, options);
return this.each(function()
{
var hvalue = opts.htext;
switch (opts.htext)
{
case 'title':
hvalue = $(this).attr('title');
break;
case 'value':
hvalue = $(this).val();
break;
}
//Modify the text value ONLY if it's non empty.
if($(this).val() === '')
{
$(this).val(hvalue);
}
//If title and value is same, apply the grey text class.
if($(this).val() === this.title)
{
$(this).addClass(opts.hclass);
//Why do you unbind the event?
};
$(this).bind('focus',
function() {
if ($(this).val() === this.title) {
$(this).val('');
$(this).removeClass(opts.hclass);
}
});
$(this).bind('blur',
function() {
if ($(this).val() === '') {
$(this).val(this.title);
$(this).addClass(opts.hclass);
}
});
});
};
$.fn.inputdynvalue.defaults = {
htext: 'title',
hclass: 'hint'
};
})(jQuery);
$(document).ready(function() {
$("input[type='text']").inputdynvalue();
});