当加载到多个选项卡上时,userscript 会自行阻塞

userscript is blocking itself when loaded on more than one tab

我在 FF56 上的 greasemonkey 3.17 以及 Vivaldi 上的 tampermonkey 中都遇到了这个问题,我无法通过 google.

找到任何关于这个问题的信息

示例脚本:

// ==UserScript==
// @name        whosebug.com
// @namespace   siod87gbnwf87rnsfdkn
// @include     https://whosebug.com/*
// @version     1
// ==/UserScript==

alert(1);
alert(2);

如您所见,它非常简单,应该给出一个消息框,然后在单击“确定”后给出第二个消息框。这基本上可以正常工作,但现在问题来了:

实际情况是,两个选项卡都会按预期显示弹出框“1”,但是当您在第一个选项卡的框上单击“确定”时,脚本将暂停,直到您在第二个选项卡的弹出框上单击“确定”。在第二个选项卡上单击两次确定后,将触发第一个选项卡上的 alert

为什么脚本不运行彼此独立?这与 alert 无关,我在使用更复杂的脚本时遇到了这个问题,但为了显示我的问题,警报的工作方式相同。

Why do the scripts not run independently from each other?

它们是 运行 "independently",因为它们不共享全局 space。但是,alert等阻塞调用是由浏览器自己处理的,ECMAScript规范中并没有规定顺序。

一个 "solution" 是不使用阻塞调用,例如 alert。相反,如果您需要打印出值,请使用 console.logconsole.info.