我有一个表单,其中输入框预先填充了默认值。如果字段为空,则jQuery事件处理程序清除'focus'上的值并恢复'blur'的默认值。
$('form input').on('focus blur', function (event) {
var eventTarget = $(this);
if (eventTarget.val() === eventTarget.data('default')
|| eventTarget.val() === '') {
if (event.type === 'focus') {
eventTarget.val('').removeClass('empty');
} else {
eventTarget.val(eventTarget.data('default')).addClass('empty');
}
}
}).trigger('blur');
在提交(通过AJAX)之前,我清空所有包含默认值的字段并触发客户端验证(对于必填字段):
$('form').on('submit', function (e) {
$('form input').each(function () {
if ($(this).val() === $(this).data('default')) {
$(this).val(''); // remove default value, so 'required' validation triggers on empty fields
}
});
if ($('form').valid()) {
$.ajax(...);
} else {
$('form input').trigger('blur'); // trigger 'blur' to restore default values
// Problem: This clears the validation messages
}
});
到目前为止,这么好,但在那之后,我的表单字段当然是空的。如果我再次触发'blur'事件,我可以恢复默认值,但这会使验证消息消失,可能是因为客户端验证再次运行并且看到字段不再为空。
但是,当我手动单击进入和退出表单域时,将恢复默认值并保留验证消息。两者都经历了相同的'模糊'处理程序。我无法弄清楚差异在哪里。
修改 我已经发现我可以完全禁用“模糊”验证:
$('form').validate().settings.onfocusout = false;
这暂时解决了我的问题,但我仍然想知道为什么当从脚本或用户交互中触发时,blur / focusout会有不同的反应。