我有一个表单,其中输入框预填充了默认值。如果字段为空,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
}
});
到目前为止,一切都很好,但是在那之后,我的表单字段当然是空的。如果我再次触发“模糊”事件,我可以恢复默认值,但这会使验证消息消失,可能是因为客户端验证再次运行并且看到字段不再为空。
但是,当我手动单击进出表单字段时,会恢复默认值并保留验证消息。两者都通过相同的“模糊”处理程序。我无法弄清楚差异在哪里。
编辑: 我后来发现我可以完全禁用“模糊”验证:
$('form').validate().settings.onfocusout = false;
这暂时解决了我的问题,但我仍然想知道为什么当从脚本或用户交互触发时模糊/聚焦的反应不同。