为什么alert()会打断代码执行?

13

当我们使用alert()时,有时候代码会出错。

例如:

HTML:

<span>Hi</span>

Javascript:

$(document).ready(function () {

    $("span").dblclick(function () {
        alert("b");
    });
    $("span").click(function () {
        alert("a");
    });

});

alert("b")并不会显示出来。

但是如果我们将两个alert()替换为console.log,那么它就会被记录下来。

警报演示控制台日志演示

那么到底发生了什么呢?


1
我不知道为什么这个问题会被踩。这是一个很好的问题。 - But I'm Not A Wrapper Class
1
很高兴发现这个问题。我甚至没有意识到这一点。我以为我的代码有 bug,因为它无法正常执行。在去掉警告后,它正常工作了 :D - Sarah
4个回答

10

alert打开一个模态对话框。当它打开时,除了警报本身之外,您无法与页面的任何部分进行交互。

由于您无法与页面交互,所以第二次单击无法触及span,因此双击事件不会触发。


另一个类似的问题:http://stackoverflow.com/questions/10173843/alert-method-not-resulting-in-window-focus-on-modern-browsers Alert 获得焦点,所以第二次点击不会发生在页面上。 - Raul Guiu

3

使用 alert() 会停止所有的代码执行。如果你已经捕获了单击并停止了代码执行,那么将无法捕获双击。

为了演示,在你的 fiddle 中我注释掉了单击的 alert。你可以在这里看到现在 alert 在双击时触发。


1
因为你捕捉了第一次点击并显示一个警告框。第二次点击没有被捕捉到,因为警告框现在获取了焦点。
如果你记录到控制台,则两次点击都会被捕捉到,并且你会注意到"a"被记录两次。

1

有一些函数被调用时会停止代码运行。这些称为同步函数,会导致代码暂停,直到您点击OK。alert()和prompt()都是同步的。这会导致单击事件发生并暂停代码运行,因此不会再发生双击事件...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接