職場でも同様の問題がありました。最終的にわかったのは、mousedown イベントが blur イベントの前に発生し、検証前にコンテンツを設定したり、フラグを使用して検証プロセスを完全にキャンセルしたりすることができるということです。
あなたの例を使用して作成したこのフィドルを確認してください-
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();
});
});
-編集-
@mclin が提案したように、mousedown イベントと preventDefault を使用すると、ぼかし動作が防止されます。そして、元のクリックイベントをそのままにしておくことができます-
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');
});
});
このソリューションは、ほとんどの場合、少しクリーンで優れている可能性がありますが、これを使用すると、Default が防止され、現在フォーカスが置かれている他の要素がぼやけますが、ほとんどのユース ケースでは問題にならないことに注意してください。