Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.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_Jquery - Fatal编程技术网

Javascript 如何判断某个事件是否由创建它的同一个事件触发?

Javascript 如何判断某个事件是否由创建它的同一个事件触发?,javascript,jquery,Javascript,Jquery,假设我有以下事件: $(button).on('mouseup', function (event1) { $(something).show(); $(document).on('mouseup', function (event2) { $(something).hide(); }); }); 所以,当点击按钮时,它会显示“某物”,而当点击文档时,它会隐藏它。如何确保第二个evnet不会在创建它的同一事件中触发?现在,这些东西将立即显示和隐藏(至

假设我有以下事件:

$(button).on('mouseup', function (event1) {
    $(something).show();

    $(document).on('mouseup', function (event2) {
        $(something).hide();
    });

});
所以,当点击按钮时,它会显示“某物”,而当点击文档时,它会隐藏它。如何确保第二个evnet不会在创建它的同一事件中触发?现在,这些东西将立即显示和隐藏(至少在firefox上)


我需要在没有任何类型的全局事件的情况下执行此操作,最好是这样。

您为什么不这样隔离事件:

$(button).on('mouseup', function (event1) {
    $(something).show();
});

$(document).on('mouseup', function (event2) {
        $(something).hide();
});

最后,我使用event.timeStamp属性检查这两个事件是否不同。还向文档事件添加了取消绑定和命名空间,以防止事件堆叠

$(button).on('mouseup', function (event1) {
    $(something).show();

    $(document).on('mouseup.'+someIdentifier, function (event2) {
        if(event1.timeStamp != event2.timeStamp) {
            $(something).hide();
            $(document).unbind('mouseup.'+someIdentifier);
        }
    });

});
这个怎么样:

$(button).on('mouseup', function (event1) {
    $(something).show();
    event1.stopPropagation();
    $(document).one('mouseup', function (event2) {
        $(something).hide();
    });

});
stopPropagation()
将阻止事件通过按钮(到达文档)

one()
将只运行一次事件,然后消失。。。可以通过再次单击按钮重新创建


这里有另一个不依赖时间戳的解决方案:

$("button").on('mouseup', function (event1) {
    $("#something").show();

    setTimeout(function () {
        $(document).one('mouseup', function (event2) {
             $("#something").hide();
        });
    }, 0);

}); 

使用延迟为0的
setTimeout
将使其在完成此事件后立即执行代码。还请注意,我使用的是
one
而不是
on
上的
,因为您只需要此事件处理程序一次,如果没有它,您将附加无限数量的事件处理程序,其中每一个事件处理程序都需要在页面上任何位置触发
mouseup
时进行处理

一个不那么愚蠢的解决方案可能是这样的:

$("button").on('mouseup', function (event1) {
     $("#something").show();
});

$(document).on('mouseup', function (event2) {
    if(event2.target != $("button")[0]) {
        $("#something").hide();
    }
});

从事件处理程序中设置事件处理程序几乎总是错误的(正如这里所示)。与其关注机制,不如描述你的目标。这会在每次释放按钮时向文档中添加新的mouseup事件吗?除此之外,您是否尝试过使用
console.log(event1)
console.log(event2)
,看看这能给您带来什么?事件在jQuery中具有
target
属性,您可以使用该属性。不过,你还是需要修改你的代码。@D.Kasipovic这很奇怪。我尝试比较时间戳,如果我只是记录事件,它会显示它们,但是如果我在if,语句中使用它们,它会显示它们为未定义。我将更改问题以显示如何操作@D.Kasipovic nevermind,我是个白痴。我使用event.timestamp而不是event.timestamp。现在可以了。我不知道是把问题改成包含答案还是自己回答……我同意这里的@Jon,你几乎肯定做错了。但至少,您应该将
上的替换为一个,这样嵌套事件将只触发一次,然后被删除。否则,您将堆积
.mouseup
事件处理程序,直到您的网页停止。即使如此,在整个文档上放置“mouseup”事件也是不好的。它可能会覆盖您的按钮事件这通常是不好的,但我正在构建一个弹出/弹出组件,我需要一种方法在用户单击文档上的任何位置时关闭弹出窗口。看看这个解决方案,它看起来更优雅是的,它更优雅,但它对我也没用。我建立这个模型是为了对弹出式/弹出式的定义有一个非常广泛的定义。我将由组件的用户来声明显示/隐藏函数和显示/隐藏条件。这就是为什么我需要这个“丑陋”的事件结构。对于隐藏和显示元素来说太复杂了。它不仅仅用于隐藏或显示元素。问题是如何区分这两个事件,我认为对于一个点击事件,时间戳是一个很好的区分因素。如果我有多个按钮,stopPropagation将允许显示多个something。这是一个解决方案,但马特的是better@Bogdan,你没有提到,但是我不知道马特的会有什么不同。。。除了他的,点击按钮也会隐藏。如果你想要最好的解决方案,你应该展示你的dom(或者它的一个例子)。而且,
show()
只显示。。。它不会产生倍数,所以我不确定你的意思:是的,对不起,我想得太多了。这只是一个例子,我的代码要复杂得多,show()和hide()函数被传递给我的组件的回调函数所取代。即使我使用了我的回调函数,我也会接受这个答案。这个答案更切题。不那么愚蠢的解决方案在功能上与第一个不同。它也没有回答具体的问题。谢谢你的第一个tho,我没有考虑过使用超时。@Bogdan:功能上是一样的。它实现了相同的目标,即当您单击按钮时,某些内容会出现,而当您单击其他任何位置时,这些内容会消失。它的功能是一样的。唯一的技术区别是,第二种解决方案总是将
mouseup
处理程序附加到文档,其中第一种解决方案仅在有人单击按钮时附加处理程序。