是否取消JavaScript中的onBlur事件?

是否取消JavaScript中的onBlur事件?,javascript,jquery,events,Javascript,Jquery,Events,我想为输入元素设置一个onBlur事件,该事件验证值,如果无效,“取消”模糊并重新聚焦输入。但是,从onBlur返回false不会像单击onClick那样取消onBlur。是否有解决方案(可能使用jQuery?您可以在处理程序中调用focus()。 这有时会有帮助。我不知道有什么可靠的跨浏览器方法可以做到这一点。通常在onblur事件中设置一个小的超时,并在计时器启动时调用focus() 例如: document.getElementById('your_input_id').onblur =

我想为输入元素设置一个onBlur事件,该事件验证值,如果无效,“取消”模糊并重新聚焦输入。但是,从onBlur返回false不会像单击onClick那样取消onBlur。是否有解决方案(可能使用jQuery?

您可以在处理程序中调用
focus()


这有时会有帮助。

我不知道有什么可靠的跨浏览器方法可以做到这一点。通常在
onblur
事件中设置一个小的超时,并在计时器启动时调用
focus()

例如:

document.getElementById('your_input_id').onblur = function() {
  var self = this;
  setTimeout(function() { self.focus(); }, 10);
}

您可以通过在零秒超时内使用jQuery的
focus()
函数来实现这一点。下面是一个例子:

$('#my_input').bind('blur', function(event) {
   var $input = $(this);
   var is_input_valid = false;

   // Code to determine if input is valid
   // ...

   if (!is_input_valid) {
      setTimeout(function() {
        $input.focus();
      }, 0);
      return false;
   }

});

如何将DOM元素传递给超时处理程序?setTimeout只接受一个代码字符串,而不是一个object@JoelFan:您可以将函数传递给
setTimeout
,请参阅我的更新答案。实际上,
setTimeout
接受函数<代码>设置超时(函数(){…},40)非常酷,谢谢!即使超时0也可以工作。(我想你只需要安排一个事件,而不是试图在正在运行的事件处理程序中完成工作)@JoelFan:是的,没错。我只是以10为例,因为实际上,0超时仍然默认为最小值10或15。这是可行的,但缺点是它仅适用于具有“id”标记的元素,并且仅当“id”在页面上保证是唯一的。如果您需要使用ID以外的内容,则可以将
this
分配给
var self
并在超时回调闭包内使用self。您可以使用的“最安全”的零秒超时实际上约为16ms。这是由于不同设备/浏览器上的JavaScript计时器不同造成的。如果您使用0表示零秒超时,您会发现您的代码有时是同步的。@Niek您有这方面的源代码吗?根据MDN,浏览器有一个最小的延迟,这是强制执行的。@cpburnz恐怕不行。该文本由匿名用户提供,作为对答案的编辑。