Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中是否可以强制事件侦听器按特定顺序启动?_Javascript_Reactjs - Fatal编程技术网

在JavaScript中是否可以强制事件侦听器按特定顺序启动?

在JavaScript中是否可以强制事件侦听器按特定顺序启动?,javascript,reactjs,Javascript,Reactjs,一旦事件在JavaScript中传播完毕,是否有一种方法可以得到通知或执行回调函数 等价地,更具体地说:是否有一种方法可以“优先”一个事件,并确保在每个其他事件侦听器被激发后调用它(几乎类似于CSS中的!重要值) 例如,如果我有3个事件侦听器-2个附加到窗口,1个附加到某个按钮元素。我是否可以强制将这些事件中的某个事件称为LAST,而不管它位于DOM中的什么位置?我知道有事件阶段和将侦听器附加到捕获或冒泡阶段的能力,但这仍然意味着有一个预设顺序 编辑:具体问题: 我正在尝试构建组件(在React

一旦事件在JavaScript中传播完毕,是否有一种方法可以得到通知或执行回调函数

等价地,更具体地说:是否有一种方法可以“优先”一个事件,并确保在每个其他事件侦听器被激发后调用它(几乎类似于CSS中的!重要值)

例如,如果我有3个事件侦听器-2个附加到窗口,1个附加到某个按钮元素。我是否可以强制将这些事件中的某个事件称为LAST,而不管它位于DOM中的什么位置?我知道有事件阶段和将侦听器附加到捕获或冒泡阶段的能力,但这仍然意味着有一个预设顺序

编辑:具体问题:

我正在尝试构建组件(在React JS中),这些组件意识到在其外部(即窗口/文档中除其自身以外的任何位置)注册了一次单击,这通常是关闭/隐藏组件的一种方式。这些组件中的每一个都将在激发属于该组件的函数的窗口对象上注册一个侦听器

问题是,当单击另一个组件[B](DOM中固有的低于窗口)来切换[A]的显示时,[B]的事件首先触发并切换状态“showA”,事件会冒泡,并且[A]的窗口事件侦听器会启动并重新切换状态“showA”-因此,[A]在两次更改状态后保持隐藏状态。我不能使用stopPropagation,因为其他窗口事件需要触发。我试着解开听众的束缚,但这没有及时发生

目前一步到位的一个例子是:

  • 单击“显示内容”按钮
  • 将侦听器添加到窗口以关闭“thing”
  • 已单击“窗口但不是对象”
  • 删除侦听器以关闭“东西”

如果我能等到单击事件结束冒泡后再添加新的侦听器,我就不会有问题了

我确实为您原来的问题留下了答案,但我看到您已经更新了它。我不会说这是特定于React的,但对于需要在单击文档时关闭/取消激活的组件来说,这是一个常见的实现

例如,下面的代码段是一个speed dial spin out按钮的实现

(函数(){
var VISIBLE_CLASS='正在显示选项',
btn=document.getElementById('.btn'),
ctn=document.getElementById('.ctn'),
showOpts=功能(e){
var processClick=函数(evt){
如果(e!==evt){
ctn.classList.remove(可见类);
ctn.IS_显示=错误;
document.removeEventListener('click',processClick);
}
};
如果(!ctn.正在显示){
ctn.IS_SHOWING=真;
ctn.classList.add(可见类);
document.addEventListener('click',processClick);
}
};
btn.addEventListener(“单击”,显示选项);

}.叫(这个)是的,您可以使用JavaScript进行回调。你能更具体地说明你想做什么吗?更新了这个问题,因为它太模糊了@sureraldreamsno。最好是将侦听器绑定到根节点,或者使用timeout,您需要它做什么?你想解决什么问题?@Bergi再次更新了q。这是相当具体的,我想。。。