我尝试了解Firefox在对话框中添加的“阻止此页面创建其他对话框”的行为。
使用jquery,如果我添加以下侦听器:
//html
<input class="testInput" />
//javascript
$('.testInput')
.click(function(){ alert('clicked') })
.keyup(function(){ alert('keyup') })
从我的非正式测试中,2.
实际上适用于未在onclick回调中调用警报框的情况(例如:keyup回调,显示响应ajax操作的警告框...)
我在Ubuntu下使用Firefox 9.0.1,据我所知,我没有调整firefox关于这些阈值的设置。 我想任何浏览器的任何最新版本都会发生这种情况。
我正在使用jQuery库,但我不认为这是相关的。
我的问题是: 使此警告出现在对话框中的确切规则是什么?
[编辑]
使用Chromium / Ubuntu(版本17.0.963.26),阈值似乎只是两个对话框之间的延迟。
你可以从jsfiddle here(thx Rory McCrossan)测试这个
答案 0 :(得分:6)
确切规则:弹出对话框之间的定时间隔。 用于确定此值的值在 SUCCESSIVE_DIALOG_TIME_LIMIT
中设置查看代码段下方链接中的第2614行:
nsGlobalWindow::DialogOpenAttempted()
TimeDuration dialogDuration(TimeStamp::Now() - topWindow->mLastDialogQuitTime);
if (dialogDuration.ToSeconds() < Preferences::GetInt("dom.successive_dialog_time_limit",SUCCESSIVE_DIALOG_TIME_LIMIT)){topWindow->mDialogAbuseCount++;return (topWindow->GetPopupControlState() > openAllowed || topWindow->mDialogAbuseCount > MAX_DIALOG_COUNT);}topWindow->mDialogAbuseCount = 0; return false;}
答案 1 :(得分:1)
如果您愿意,可以使用Firefox源代码。请注意,不同的浏览器会有不同的规则。
Firefox的相关代码位于nsGlobalWindow.cpp
和nsGlobalWindow.h
(以下链接是行号,因此会随着源的变化而慢慢腐烂)。它似乎由nsGlobalWindow.h
和MAX_DIALOG_COUNT
中的常量SUCCESSIVE_DIALOG_TIME_LIMIT
(10)控制(3,单位为秒)。 nsGlobalWindow.cpp
保持计数(mDialogAbuseCount
)。显然,dialogDuration
函数可以递增或清除mDialogAbuseCount
,具体取决于对话框的打开时间是否超过SUCCESSIVE_DIALOG_TIME_LIMIT。 AreDialogsBlocked
函数使用mDialogAbuseCount
(部分)来判断它们是否被阻止。
所以简而言之:如果你反复打开弹出窗口然后在三秒内关闭弹出窗口,那么在10秒左右之后你会触发一些东西。