以下代码旨在检查是否在模糊字段中输入了 4 个数字。如果不是,则删除字段值,并聚焦该字段。删除工作正常,但对 focus() 的调用不起作用。
$('input.dateValue').live('blur',function(event){
if (!(/(\d){4}$/.test($(this).attr('value')))) $(this).attr('value','').focus();
});
为什么对 focus() 的调用不聚焦该字段?
以下代码旨在检查是否在模糊字段中输入了 4 个数字。如果不是,则删除字段值,并聚焦该字段。删除工作正常,但对 focus() 的调用不起作用。
$('input.dateValue').live('blur',function(event){
if (!(/(\d){4}$/.test($(this).attr('value')))) $(this).attr('value','').focus();
});
为什么对 focus() 的调用不聚焦该字段?
由于blur
事件在实际失去焦点之前触发,因此您不能.focus()
立即使用。您必须将其向下推入堆栈,以便在input
失去焦点后执行。把你.focus()
的计时器(不需要延迟):
$('input.dateValue').on('blur', function(event)
{
if ( ! /(\d){4}$/.test(this.value) )
{
var $this = $(this).val('');
setTimeout(function (){
$this.focus();
}, 0);
};
});
这是小提琴:http: //jsfiddle.net/TdfFs/
更新:为了证明这在 Chrome中确实有效,我做了另一个小提琴:http: //jsfiddle.net/TdfFs/1/
演示 http://jsfiddle.net/dsaSX/3/
尝试使用this.value
而不是$(this).attr(...)
休息希望这有助于事业,:)
哦,.on
如果您使用的是 Jquery 1.7 及更高版本,我已经使用了事件。
阅读本文:jQuery .val() 和 .attr('value') 有什么区别?
在这里阅读 http://forum.jquery.com/topic/jquery-focus-after-blur
另一个带有 SetTimeOut的已知论坛解决方案 http://forum.jquery.com/topic/focus-inside-a-blur-handler见下面的帖子
代码
$('input.dateValue').on('blur', function(event) {
if (!(/(\d){4}$/.test(this.value))) {
$(this).val('').focus();
};
});
而不是模糊使用focusout
http://jsfiddle.net/fedmich/aKY9f/
尖端:
缩进你的代码
而不是 attr,值使用 $.val('')
在使用 IF() 时,请使用括号{}
写得更干净,尽可能简单,这样你以后就不会感到困惑。
快乐编码:)
小细节,
大多数时候我读到这样的问题。这通常是因为事件不正确。在要求系统将焦点设置在某事上之前,请确保您的页面已得到处理。
这是一个例子,其中事件 pageshow 比 pagebeforeshow 更好
不像这样工作
/**
*** a hook to handle list drawing. DOES NOT WORK**
*/
$(document).delegate('#dropdownPopupWindow', "pagebeforeshow", function() {
console.log(UIPopup.TAG+"pagebeforeshow on popup dropdownPopupWindow is setting focus on field field_dropdown_label");
$('#field_dropdown_label').focus();
});
像这样工作
/**
*** a hook to handle list drawing.**
*/
$(document).delegate('#dropdownPopupWindow', "pageshow", function() {
console.log(UIPopup.TAG+"pageshow on popup dropdownPopupWindow is setting focus on field field_dropdown_label");
$('#field_dropdown_label').focus();
});
如果您使用的是 Bootstrap 模态,这不起作用:
$('#modalID').modal('show');
$('#modalID #fieldID').focus();
因为它需要一些时间来绘制模态并且可以用于聚焦......我发现400ms的超时足够快,用户不会受到影响并且足够慢,它总是专注于元素。
$('#modalID').modal('show');
setTimeout(function(){ $('#modalID #fieldID').focus(); }, 400);
实际上,使用可执行注释并没有什么坏处:
function wait_for_modal_to_be_drawn_then( fn )
{
setTimeout( fn, 400 );
}
$('#modalID').modal('show');
wait_for_modal_to_draw_then(
function(){ $('#modalID #fieldID').focus(); }
);