如何在模糊事件后获得焦点事件?

时间:2009-09-04 08:58:13

标签: javascript javascript-events

当我在my(javascript)处理程序中收到onBlur事件时,我想知道onFocus事件是什么(如果有的话)。这怎么可能?

示例:我有一组构成一个组的文本框。只有当整个小组失去焦点时,我才想通知订阅者关于小组onBlur事件。因此,如果发生onBlur事件,我只想在我注意到组中另一个文本框上没有onFocus事件后才转发它。

我现在通过延迟来做这件事,并查看焦点事件是否同时发生。但我不喜欢这个解决方案:由于延迟,焦点发生后模糊发生,延迟模糊中包含的事件“老”,这在进一步处理时可能会很棘手。

我的想法是:查看“事件队列”,当我收到模糊事件时,检测将跟随的任何onFocus事件......但我不知道这是否可行以及如何执行此操作:(。 ..

3 个答案:

答案 0 :(得分:1)

- 编辑:

在审核了你的问题后,我不太确定你在问什么,所以我不确定我发布的内容是否合适。无论如何,我把它留在这里考虑。

您可以使用地图和'this'变量轻松完成:

var map = new Object();

...

function doBlur (obj) {
   if(map[obj] == "focus"){
   }
}

function doFocus (obj) {
    map[obj] = "focus";
}

<input onblur="doBlur(this);" onfocus="doFocus(this);" />

但更进一步,考虑到一次只能聚焦一个文本框,你可以只有一个名为lastFocus的变量,并检查该对象是否等于你想要的那个。

答案 1 :(得分:1)

焦点和模糊事件应该添加到事件队列中,所以一个简单的1-100毫秒setTimeout可能就可以了。

我知道你没有使用jQuery - 但我更容易使用它来编写代码示例:

var blurTimeout;

function blurAlert() {
   alert('Lost Focus');
}

// assign these two simple functions to all inputs on the page.
$('input').blur(function() {
  blurTimeout=setTimeout(blurAlert, 1);
}).focus(function() {
  clearTimeout(blurTimeout);
});

我刚刚在firefox中测试了1ms,我很确定时间也适用于其他浏览器。由于处理事件的方式,模糊点火,然后聚焦,然后是计时器。

如果您确实希望确保事件处理程序变为事件的this左右:

 function() { 
   blurTimeout = setTimeout(function() {
     blurAlert.apply(this,arguments);
   }, 1);
 }

答案 2 :(得分:0)

您可以使用blur and focus的委派方法 因此,您将检查重点是什么。