Chrome 在没有任何用户交互的情况下立即关闭 Confirm() 提示

Posted

技术标签:

【中文标题】Chrome 在没有任何用户交互的情况下立即关闭 Confirm() 提示【英文标题】:Chrome dismisses confirm() promps immediately without any user interaction 【发布时间】:2018-07-09 16:48:05 【问题描述】:

我们网站的一些用户报告说confirm 对话框出现了,但立即消失了,就好像它们被自动关闭一样。这似乎只影响 Chrome,而不影响其他浏览器(甚至 Chromium)。

搜索类似问题会发现很多人抱怨onbeforeunload 中的confirm 对话框,但这不是我的问题:在那种情况下不是confirm 对话框在页面初始加载时显示(由 jQuery $(document).ready() 触发)。

Chrome documentation 表明confirm 不会激活其选项卡,并且在切换选项卡时将被关闭。没关系:选项卡已经处于活动状态(confirm 对话框出现在页面加载时),我很高兴在切换选项卡时它被关闭。问题是它会立即被解除,没有任何用户交互。

我找到了one similar report,但在这种情况下,confirm 提示从未出现过。看起来我们看到的是不同的东西。

$(document).ready(function() 
var c = confirm('Are you sure you wish to delete this entry?');
if (c) 
    $.ajax(
        '/api/show/competition/delete',
        
            'method': 'POST',
            'data':  'id' : 9 ,
            'dataType': 'json',
            'complete': function(response, status) 
                if (response.responseJSON.error) 
                    alert(response.responseJSON.message);
                    window.location.reload();
                 else 
                    document.location.href = "/show/application/competition";
                
            
        
    );
 else 
    document.location.href = "/show/application/competition/entry/9";

);

如有必要,我们可以使用 jQuery 模态窗口,但使用整个库来替换一行代码似乎很愚蠢。无论如何,原生浏览器警报在移动浏览器中往往看起来更好。

【问题讨论】:

您确定它不是弹出窗口阻止程序或 chrome 阻止它,因为没有触发用户操作来显示提示。 在您的链接中,通过删除一些扩展然后重新启动浏览器解决了问题。你确定这不是这个问题的问题(也许他们有广告拦截器)? 【参考方案1】:

我遇到了完全相同的问题。这似乎是一个铬问题。

这需要一个技巧。 就我而言,它通过使用 setTimeout 函数延迟 0.1 秒来工作。

试试这个。它会起作用的。

function doConfirm() 
  var c = confirm('Are you sure you wish to delete this entry?');
  if (c) 
    $.ajax(
        '/api/show/competition/delete',
        
            'method': 'POST',
            'data':  'id' : 9 ,
            'dataType': 'json',
            'complete': function(response, status) 
                if (response.responseJSON.error) 
                    alert(response.responseJSON.message);
                    window.location.reload();
                 else 
                    document.location.href = "/show/application/competition";
                
            
        
    );
   else 
    document.location.href = "/show/application/competition/entry/9";
  


$(document).ready(function() 
  setTimeout(function() doConfirm() , 100);    
);

【讨论】:

完美解决方案。赞赏。 这个问题是由 iFrame 引起的,这并不总是有效,这取决于 iFrame 加载时间(或者至少我认为是这样),所以它不是一个可行的解决方案。 谢谢。这让我快疯了。我花了半个晚上试图用 DIV 设计一个模态对话框并且讨厌它。我的用例很简单——提醒用户他们需要输入电子邮件地址。但它一直在铬上消失。这个延迟解决了这个问题。 我在这里同意@Silencer。 Chrome 似乎有这个错误很长一段时间了,根据我的理解,当页面/iframe 导航到不同的位置时,chrome 似乎正在关闭任何活动对话框(alertconfirmprompt)没有任何用户交互。由于我们无法确定任何 iframe 的确切加载/导航时间,setTimeout 尽管看起来已经解决了这个问题,但肯定有一天会中断。 (除非我遗漏了什么)【参考方案2】:

就我而言,问题是由 iframe 引起的。我有一个 youtube 视频 iframe,警报会在显示几毫秒后关闭。删除 iframe 后,一切都恢复正常了。

【讨论】:

遇到同样的问题,但我无法移除 iFrame,找不到解决方案。 同样的问题,setTimeout 为我工作了 250 毫秒。【参考方案3】:

在我的情况下,点击事件功能中的确认对话框出现了问题。用“mouseup”替换“click”解决了这个问题。

【讨论】:

【参考方案4】:

就我而言,Facebook Remarketing Pixel 是问题的根源。

【讨论】:

这似乎是页面上 Facebook 和 Twitter iframe 的普遍问题。我们最终放弃并切换到 jQuery 模式。【参考方案5】:

添加超时的一种稍微优雅但有效的方法是包含像underscore.js 这样的库,并将处理程序函数去抖动约100ms。如果您有 iFrame,则可能并非如此,但如果没有 iFrame,这绝对是个问题,这对我来说立竿见影。

$("#my-selector").on("click", _.debounce(handleClick, 100));

【讨论】:

以上是关于Chrome 在没有任何用户交互的情况下立即关闭 Confirm() 提示的主要内容,如果未能解决你的问题,请参考以下文章

在没有用户交互jquery的情况下播放音频

启动 Chrome 并等待它关闭 [重复]

在没有任何用户控制或交互的情况下在 iPhone 上播放全屏视频?

如何在没有任何用户交互的情况下进行服务器到服务器的文件传输?

如何在没有用户交互的情况下禁用 wifi 辅助

在没有用户交互的情况下播放波纹动画