2014-09-05 75 views
0

这是一个抽象问题,但我一直在思考它的实用性,也许它已经被解决或者启发某人基于它做些事情。在JS中同步浏览器事件

最近我遇到了一个问题,三个浏览器事件都是由单个用户交互引发的:点击,模糊和焦点。当用户从一个输入点击到另一个输入时,发生这些事件;并且在用户从一个标签到另一个标签时发生类似的设置。

我遇到的麻烦是他们按照这个顺序开火:模糊,焦点,点击。这意味着,如果模糊事件导致DOM更改,则点击事件可能会受到影响。我真的很想点击,模糊,专注 - 但这不是浏览器给我的。

我觉得可以生成一个通用工具,捕获和取消浏览器事件,然后同步它们并为所有三个事件启动一个处理程序。也许扩展Event类以便事件可以恢复。

是否有更抽象的设计模式,我可以在这里使用?什么东西可以让我设置任意数量的事件侦听器,然后在所有事件完成时触发单个事件?它是否已经有一个实现?所有建议欢迎。

+0

是的,你可以实现你的抽象监听器。但是,请确定当它们没有被同一动作触发时应该发生什么(这可能只能实现为“一起在短时间内一起开火”)。从关注不同于您感兴趣的元素的模糊事件,或者通过不点击而这样做。 – Bergi 2014-09-05 13:01:25

回答

0

不需要打破这个头!您始终可以触发这些事件编程

注意:这里引用的object是使用JavaScript选择器选择的任何元素。

最初onBlur & onFocusevent.preventDefault允许onClick做的工作首先

var clicked=false; 
object.onblur = function(e) { 
    if (!clicked) { 
     e.preventDefault 
    } 
}; 

object.onfocus = function(e) { 
    if (!clicked) { 
     e.preventDefault 
    } 
}; 

点击事件中撤消上述预防措施,并触发你想

object.onclick=function(){ 
clicked=true; 
//Do anything 
object.unbind('blur'); //this do undo prevent default 
object.unbind('focus'); //this do undo prevent default 

object.blur(); //in order you want 
object.focus(); 

//make sure to put condition if click clicked 
}; 

这就是它的顺序事件!希望它有帮助