У нас была похожая проблема на работе. что мы выяснили в конце
было то, что событие mousedown будет срабатывать до события размытия
позволяя вам установить содержимое до проверки или даже отменить проверку
полностью обработать, используя флаг.
проверь эту скрипку, которую я сделал на твоем примере.
http://jsfiddle.net/dL3K3/31/
$(function(){
var flag = true;
$('input').blur(function(){
if(!$(this).val() && flag){
alert("Grrr, It's empty");
}
});
$('button').mousedown(function(){
flag = false;
});
$('button').mouseup(function(){
flag = true;
$('input').val('content').focus();
});
});
-Edit-
В соответствии с предложением @mclin, использование события mousedown и protectDefault предотвратит размытие.
И вы можете просто оставить исходное событие клика без изменений -
http://jsfiddle.net/dL3K3/364/
$(function(){
$('input').blur(function(){
if(!$(this).val()){
alert("Grrr, It's empty");
}
});
$('button').mousedown(function(e){
e.preventDefault();
});
$('button').click(function(){
$('input').val('content');
});
});
Это решение может быть немного чище и лучше для большинства случаев, просто отметьте, что если вы используете его, вы предотвратите дефолт и размытие любого другого элемента, на котором в данный момент находится фокус, но для большинства случаев использования это не должно быть проблемой.