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
处理程序附加到文档,其中第一种解决方案仅在有人单击按钮时附加处理程序。