Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.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_Events_Javascript Events_Event Handling - Fatal编程技术网

Javascript 检查是否从事件处理程序函数触发了另一个事件

Javascript 检查是否从事件处理程序函数触发了另一个事件,javascript,events,javascript-events,event-handling,Javascript,Events,Javascript Events,Event Handling,让我们想象一下,我有一个事件处理程序函数附加到一个图像,例如,onmouseover处理程序。如果特定元素触发onmouseover事件,我不希望运行此处理程序 更具体地说,我有一个悬停的图像,一个菜单弹出。如果鼠标移出该图像,我想关闭该菜单,除非我将鼠标移到与该图像相邻的菜单 在伪代码中是这样的 img.mouseout = function () { if (otherelement.onmouseover.fired) { leave the menu as it is } else

让我们想象一下,我有一个事件处理程序函数附加到一个图像,例如,onmouseover处理程序。如果特定元素触发onmouseover事件,我不希望运行此处理程序

更具体地说,我有一个悬停的图像,一个菜单弹出。如果鼠标移出该图像,我想关闭该菜单,除非我将鼠标移到与该图像相邻的菜单

在伪代码中是这样的

img.mouseout = function () {
if (otherelement.onmouseover.fired) {
 leave the menu as it is
} 
else 
{
close the menu
}

那么,如何检查是否触发了另一个事件呢?

我将添加一个超时和一个鼠标悬停处理程序,在另一个处理程序中清除它。虽然这些元素在视觉上可能正好相邻,但添加一个小计时器更安全,因为mouseout事件可能只在一个很小的1px区域触发,从而导致可怕的闪烁

这也允许快速鼠标擦洗而不闪烁

比如:

var timer;

img.onmouseout = other.onmouseout = function() {
  timer = setTimeout(closemenu, 100);
}

img.onmouseover = other.onmouseover = function() {
  clearTimeout(timer);
}

function closemenu() {
  // close it
}

您必须自己跟踪它,这将因为您对事件处理程序调用顺序的控制很弱而变得复杂。