6

以下代码旨在检查是否在模糊字段中输入了 4 个数字。如果不是,则删除字段值,并聚焦该字段。删除工作正常,但对 focus() 的调用不起作用。

$('input.dateValue').live('blur',function(event){
  if (!(/(\d){4}$/.test($(this).attr('value')))) $(this).attr('value','').focus();
});

为什么对 focus() 的调用不聚焦该字段?

4

5 回答 5

18

由于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/

于 2012-07-08T03:31:14.957 回答
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();
    };
});​
于 2012-07-08T03:17:58.357 回答
0

而不是模糊使用focusout

http://jsfiddle.net/fedmich/aKY9f/


尖端:

缩进你的代码

而不是 attr,值使用 $.val('')

在使用 IF() 时,请使用括号{}

写得更干净,尽可能简单,这样你以后就不会感到困惑。

快乐编码:)

于 2012-07-08T03:29:33.543 回答
0

小细节,

大多数时候我读到这样的问题。这通常是因为事件不正确。在要求系统将焦点设置在某事上之前,请确保您的页面已得到处理。

这是一个例子,其中事件 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();
});
于 2012-07-25T12:02:50.347 回答
0

如果您使用的是 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(); } 
);
于 2015-07-31T14:48:03.827 回答