为啥警告框中会出现“阻止此页面创建其他对话框”?
Posted
技术标签:
【中文标题】为啥警告框中会出现“阻止此页面创建其他对话框”?【英文标题】:Why "Prevent this page from creating additional dialogs" appears in the alert box?为什么警告框中会出现“阻止此页面创建其他对话框”? 【发布时间】:2011-08-16 10:39:11 【问题描述】:在我的 Rails 3 应用程序中:
render :js => "alert(\"Error!\\nEmpty message sent.\");" if ...
有时,在此错误消息下方(在同一个警告框中)我会看到:“阻止此页面创建其他对话框”和一个复选框。
这是什么意思?
是否可以不显示这些额外的文本和复选框?
我使用 Firefox 4。
【问题讨论】:
浏览器认为你的 js 代码有一些错误,它在某种循环中非常频繁地显示消息,因此浏览器为用户提供了禁用此警告框的选项 Chrome 从第二个alert
开始显示此内容,无论这些警报的内容或长度如何..
@ShadowWizard 截至今天,它似乎是基于自上次警报关闭以来经过的时间。计时器大约是一秒左右。
@Dan 是的,可能他们多年来改变了它。 :)
【参考方案1】:
这是一项浏览器功能,可阻止网站一遍又一遍地显示烦人的警报框。
作为 Web 开发人员,您无法禁用它。
【讨论】:
【参考方案2】:这是什么意思?
这是浏览器端的一项安全措施,通过在无限循环中显示模态(警报/确认)消息来防止页面冻结浏览器(或当前页面)。参见例如here 用于 Firefox。
您无法关闭此功能。解决它的唯一方法是使用自定义对话框,如 JQuery UI's dialogs。
【讨论】:
只是补充一点:从 Firefox 4 开始,这些警报不再是模态的,至少不是窗口管理器。您现在可以轻松导航到其他选项卡/窗口。【参考方案3】:您可以使用 java 脚本创建自定义警报框,以下代码将覆盖默认警报功能
window.alert = function(message) $(document.createElement('div'))
.attr(
title: 'Alert',
'class': 'alert'
)
.html(message)
.dialog(
buttons:
OK: function()
$(this).dialog('close');
,
close: function()
$(this).remove();
,
modal: true,
resizable: false,
width: 'auto'
);
;
【讨论】:
你能说明如何使用它吗?也许添加一些关于如何使用和发生了什么的描述?【参考方案4】:使用JQuery UI's dialogs 并不总是一个解决方案。据我所知,警报和确认是在某个点停止执行脚本的唯一方法。作为一种解决方法,我们可以提供一种机制让用户知道应用程序需要调用警报和确认。例如,可以这样做(其中 showError 使用 jQuery 对话框或其他方式与用户交流):
var f_confirm;
function setConfirm()
f_confirm = confirm;
confirm = function(s)
try
return f_confirm(s);
catch(e)
showError("Please do not check 'Prevent this page from creating additional dialogs'");
return false;
;
;
【讨论】:
“警报和确认是在某个点停止执行脚本的唯一方法” - 当您同步思考时,这是真的。但是,这些可以使用 jQueryUI 控件触发另一个方法,然后处理结果。 异步思考也是如此。使用回调不会停止代码在两者之间的执行。但正如你所说,在使用 jQuery 对话框时,传入回调函数是控制流程的好方法。【参考方案5】:我设计这个功能是为了绕过我的网络应用程序中的复选框。
它在执行时会阻止页面上的所有功能(假设自用户关闭最后一个对话框以来已经过去了不到三秒),但我更喜欢它而不是递归或 setTimeout 函数,因为我不必为这种可能性编写代码等待对话框出现时点击或触发的其他内容。
在 Modalbox 中已包含的报告上显示错误/提示/确认时,我最需要它。我可以为其他对话框添加一个 div,但如果可以使用内置对话框,这似乎太混乱且没有必要。
请注意,如果将 dom.successive_dialog_time_limit 更改为大于 3 的值,这可能会中断,我也不知道 Chrome 是否具有与 Firefox 相同的默认值。但至少这是一种选择。
另外,如果有人可以改进它,请做!
// note that these should not be in the global namespace
var dlgRslt,
lastTimeDialogClosed = 0;
function dialog(msg)
var defaultValue,
lenIsThree,
type;
while (lastTimeDialogClosed && new Date() - lastTimeDialogClosed < 3001)
// timer
lenIsThree = 3 === arguments.length;
type = lenIsThree ? arguments[2] : (arguments[1] || alert);
defaultValue = lenIsThree && type === prompt ? arguments[1] : '';
// store result of confirm() or prompt()
dlgRslt = type(msg, defaultValue);
lastTimeDialogClosed = new Date();
用法:
dialog('This is an alert.');
dialog( 'This is a prompt', prompt );
dialog('You entered ' + dlgRslt);
dialog( 'Is this a prompt?', 'maybe', prompt );
dialog('You entered ' + dlgRslt);
dialog( 'OK/Cancel?', confirm );
if (dlgRslt)
// code if true
【讨论】:
【参考方案6】:这是一个浏览器功能。
如果可以,请尝试使用http://bootboxjs.com/,使用此库您也可以这样做
alert("Empty message sent");
通过写作:
bootbox.alert("Empty message sent", function(result)
// do something whit result
);
你也会得到一个漂亮的用户界面!
【讨论】:
以上是关于为啥警告框中会出现“阻止此页面创建其他对话框”?的主要内容,如果未能解决你的问题,请参考以下文章