Javascript Chrome扩展事件和嵌套回调

Javascript Chrome扩展事件和嵌套回调,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我已经见过这个问题好几次了,我想我误解了一些范围规则 在弹出式html中,我有一个按钮: <button id="submit">Click Me</button> 如果我打开弹出窗口并单击按钮,新选项卡将打开到determineURL(),但警报不会执行。但是,如果我检查弹出窗口,在新选项卡打开和加载时有效地将其保持打开状态,则会执行警报。不会调用回调,因为弹出页面会按时间顺序在回调启动之前关闭。考虑这两个断言: 使用chrome.tabs.create创建一个新选

我已经见过这个问题好几次了,我想我误解了一些范围规则

在弹出式html中,我有一个按钮:

<button id="submit">Click Me</button>

如果我打开弹出窗口并单击按钮,新选项卡将打开到
determineURL()
,但警报不会执行。但是,如果我检查弹出窗口,在新选项卡打开和加载时有效地将其保持打开状态,则会执行警报。

不会调用回调,因为弹出页面会按时间顺序在回调启动之前关闭。考虑这两个断言:

  • 使用
    chrome.tabs.create创建一个新选项卡时,会立即关闭任何打开的扩展弹出窗口

  • chrome.tabs.create
    回调仅在创建选项卡后触发

  • 未加载的页面不可能运行脚本

因此,在弹出页面中运行的脚本如下所示:

  • 弹出窗口中的脚本将创建一个选项卡

  • 由于新选项卡打开,弹出窗口被迫关闭

  • 弹出窗口中的脚本会引发警报


  • 请注意,步骤3是不可能的(根据我上面的第三个断言),只要步骤2是真的。使用检查模式使弹出窗口持久化,并防止发生步骤2

    我知道也可以将脚本注入匹配的URL,但扩展的用户可能希望在插入脚本和不插入脚本的情况下查看页面,因此我必须以编程方式将其注入从扩展打开的新选项卡。快速猜测:打开选项卡的动作会自动关闭扩展弹出窗口,并且弹出页面中的脚本不能再运行(因为页面不再打开)。在inspect模式下激活弹出窗口将强制它在选项卡创建过程中保持活动状态。是的,这是观察到的行为。检查弹出窗口会绕过自动关闭,但这显然是一个不可接受的解决方案。因此,您的问题是如何发出警报——如果您编辑问题使其更明确,您将得到更直接的答案。目前看来,你可能只是在寻找一个看似反常行为的解释。在任何情况下,都不可能存在您误解的范围规则;在回调运行之前,页面可能刚刚关闭。我发现后台脚本将执行我想要的操作,但我想知道回调没有实际执行是否有原因。。。回电话。这不是我第一次看到这种行为。
    document.getElementById("submit").onclick=function(){
        var response = function(tab){
            alert('success ' + tab.id);
        };
        chrome.tabs.create({url: determineURL()}, response);
    };