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 似乎正在关闭任何活动对话框(alert
,confirm
,prompt
)没有任何用户交互。由于我们无法确定任何 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() 提示的主要内容,如果未能解决你的问题,请参考以下文章
在没有任何用户控制或交互的情况下在 iPhone 上播放全屏视频?