jQuery焦点不起作用

Puz*_*Boy 32 javascript jquery

我试图专注于信用卡验证失败.但奇怪的是focus()不工作.

$('#cc_number').validateCreditCard(function (result) {
    if (result.length_valid && result.luhn_valid) {

    } else {
       $("#cc_number").focus();
       return false;
    }
});

<input  type="text" id='cc_number' name="cc_number" />
Run Code Online (Sandbox Code Playgroud)

Cur*_*urt 56

正如评论中提到的,您的原始jsfiddle包含解决方案.

解决方法是在焦点调用上设置超时.

setTimeout(function(){
    $("#cc_number").focus();
}, 0);
Run Code Online (Sandbox Code Playgroud)

我不是百分百肯定,但可能是因为在模糊时调用警报,你实际上从不允许文本框失去焦点,因此当调用焦点时,它已经拥有它.

通过使用超时,您将逻辑放入一个单独的线程,该线程与主javascript代码分开运行(非常类似于回调函数).


但正如你的问题评论也提到的那样,强制关注直到验证通过是令人讨厌的.

但这更多是针对用户体验的批评.

  • "通过使用超时,你将逻辑放入一个单独的线程"是不正确的.JS没有使用线程.做`setTimeout(...,0)`也行. (5认同)
  • 如果你能解释为什么会这样,我会完全给它+1. (4认同)
  • JavaScript不是多线程的:http://ejohn.org/blog/how-javascript-timers-work/ (3认同)
  • 这是因为事件发生的时间.如果在"模糊"事件中设置焦点,则输入将获得焦点.但是,由于模糊事件尚未完成,因此在事件完成时它将失去焦点.添加超时允许.focus()在blur事件完成后发生.您也可以取消原始事件以获得相同的效果. (2认同)

Sho*_*ate 17

您的DOM可能正在刷新,因此焦点不在此处.相反,你可以遵循这种方法:

$('#cc_number').validateCreditCard(function (result) {
    if (result.length_valid && result.luhn_valid) {

   } else {
      $("#cc_number").attr("autofocus","autofocus")
      return false;
   }
});
Run Code Online (Sandbox Code Playgroud)