【问题标题】:JavaScript/jQuery on click, confirm fires twice单击 JavaScript/jQuery,确认触发两次
【发布时间】:2016-05-05 19:42:29
【问题描述】:

问题自行解决了...

仅供参考:显然 Mac OS 或 Chromium 引擎错误,因为上次系统和浏览器更新问题后突然消失,就像之前出现的一样.看起来它与 jQuery 或 JavaScript API相关。

我会保留这个问题几天,稍后我会删除它,因为它在这种情况下不符合 StackOverflow 规则。


原帖:

我在点击监听器中有简单的 JS 确认,就像下面的代码一样,没有更多的请求(即 AJAX,没有重复的 JS 包含等)。

问题是在某些浏览器(即 Mac OS 上的 Chrome 和 Opera)中,确认对话框被触发 两次,我的问题是,我是否遗漏了一些明显的东西,或者是提到的浏览器的相当大的错误?有什么解决方法可以帮助我防止这种情况发生吗?还尝试使用e.preventDefault(); 也没有运气。

编辑我还应该提到,如果在点击中没有confirm('...');,它只会触发一次(所以只有一个让我们检查...控制台出现)。确认两个日志在控制台中出现两次,但布尔值与单击的顺序相反-对于示例-如果我先单击Cancel,然后单击OK,则控制台日志首先是true,最后是false ...很奇怪:S

版本:

  • jQuery 版本:1.11.3 - 1.12.0
  • Chrome:47.0.x(最新)
  • Opera:34.0.*(最新)

示例代码(完整):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test...</title>
    <script src="http://code.jquery.com/jquery-1.12.0.min.js"></script>
</head>
<body>

    <div class="myBtn" data-field="one">Take one</div>
    <div class="myBtn" data-field="two">Take two</div>
    <div class="myBtn" data-field="three">Take three</div>
    <div class="myBtn" data-field="four">Take four</div>

    <script>
        $(document).ready(function () {
            $(document).on('click', '.myBtn', function () {
                console.log('Let us check...');
                var confirmation = confirm('Are you sure you want ' + $(this).data('field') + '?');
                console.log(confirmation);
            });
        });
    </script>

</body>
</html>

或者直接点击这里:https://jsfiddle.net/gu58wwtg/1/

上次编辑:刚刚检查了其他可能性,例如裸方法(使用纯 JS,没有 jQuery)和 prompt('...');(也以相反的顺序打开两次)而不是 confirm('...');,问题仍然存在发生了,所以我怀疑是一个错误,对不起,打扰你了,感谢你的关注。我会保留这个问题,这样其他人可以节省一些时间来解决挫折;)

【问题讨论】:

  • 如果元素不是动态生成的,您不必委托事件。
  • @Jai,使用委托没有害处,无法在 Chrome 版本 48.0.2564 上重现该问题
  • @Satpal 刚刚提到,如果元素是静态的,则不需要。
  • 无法复现,但你可以尝试一个api,api.jquery.com/one
  • @biesior 是的,在处理程序中使用任何模式时,关于旧 webkit 引擎和焦点事件被触发两次的旧错误。我怀疑这是同一种错误。你应该向铬团队报告。也许这与使用 WKWebView 的最新更新有关。出于测试目的,我会尝试使用mouseup 事件而不是委托事件,并且可能检查event.target,也许等等......

标签: javascript jquery google-chrome


【解决方案1】:

我认为你应该使用.one

$(document).one('click', '.myBtn', function () {

描述.one() 将处理程序附加到元素的事件。每个事件类型的每个元素最多执行一次处理程序。

【讨论】:

  • 很遗憾没有解决问题,如果用户点击Cancel他就不能再点击了:/
【解决方案2】:

尝试清除 chrome 设置中的缓存以及文件的历史记录,然后关闭浏览器。 然后再试一次。

我使用与您类似的代码并且它有效!

<script>
    //$(document).ready(function () {
        $(document).on('click', '.myBtn', function () {
            console.log('Let us check...');
            var confirmation = confirm('Are you sure you want ' + $(this).data('field') + '?');
            console.log(confirmation);
        });
   // });
</script>

它会发射一个!那是铬。我不确定这是一个错误。这可能是 chrome 存储它的方式。 但是我没有在 Mac 上尝试过 Opera(因为我没有 Mac)

【讨论】:

  • Thx @Herman,我编辑了我的帖子,(最后一次编辑)并且我不再怀疑错误了......清除缓存,使用非 jQuery 方法和其他典型的东西不会改变任何东西.甚至prompt() 也被调用了两次
  • 鼠标有什么问题吗?您是否尝试过关闭浏览器 :D 抱歉。只是猜测。我正在尝试解释此链接并尝试回答您的问题。 stackoverflow.com/questions/1195440/…
  • 我也检查了这种可能性,鼠标没问题;)
猜你喜欢
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
相关资源
最近更新 更多