“阻止此页面创建其他对话框”的规则

时间:2012-01-13 13:26:44

标签: javascript jquery firefox

我尝试了解Firefox在对话框中添加的“阻止此页面创建其他对话框”的行为。

使用jquery,如果我添加以下侦听器:

//html
<input class="testInput" />

//javascript
$('.testInput')
.click(function(){ alert('clicked') })
.keyup(function(){ alert('keyup') })
  1. 点击输入时,警报框会正常显示,直到 〜第13次。
  2. 另一方面,当按键时,第二个消息框已经存在 出现消息“阻止此页面创建其他内容 对话框“。实际上,似乎有一些关系,如果我等待 比如两次击键之间的2秒钟,消息就会消失。
  3. 从我的非正式测试中,2.实际上适用于未在onclick回调中调用警报框的情况(例如:keyup回调,显示响应ajax操作的警告框...)

    我在Ubuntu下使用Firefox 9.0.1,据我所知,我没有调整firefox关于这些阈值的设置。 我想任何浏览器的任何最新版本都会发生这种情况。

    我正在使用jQuery库,但我不认为这是相关的。

    我的问题是: 使此警告出现在对话框中的确切规则是什么?

    [编辑]

    使用Chromium / Ubuntu(版本17.0.963.26),阈值似乎只是两个对话框之间的延迟。

    你可以从jsfiddle here(thx Rory McCrossan)测试这个

2 个答案:

答案 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;}

Link to source

答案 1 :(得分:1)

如果您愿意,可以使用Firefox源代码。请注意,不同的浏览器会有不同的规则。

Firefox的相关代码位于nsGlobalWindow.cppnsGlobalWindow.h(以下链接是行号,因此会随着源的变化而慢慢腐烂)。它似乎由nsGlobalWindow.hMAX_DIALOG_COUNT中的常量SUCCESSIVE_DIALOG_TIME_LIMIT(10)控制(3,单位为秒)。 nsGlobalWindow.cpp保持计数(mDialogAbuseCount)。显然,dialogDuration函数可以递增或清除mDialogAbuseCount,具体取决于对话框的打开时间是否超过SUCCESSIVE_DIALOG_TIME_LIMIT。 AreDialogsBlocked函数使用mDialogAbuseCount(部分)来判断它们是否被阻止。

所以简而言之:如果你反复打开弹出窗口然后在三秒内关闭弹出窗口,那么在10秒左右之后你会触发一些东西。