【问题标题】:Closure handler gives TypeError: foo is not a function闭包处理程序给出 TypeError: foo is not a function
【发布时间】:2020-11-29 13:51:13
【问题描述】:

我正在制作一个 Chrome 扩展程序,有人可以在其中使用特定站点上的上下文菜单,从中获取一些图像并将它们加载到新选项卡(扩展程序文件夹中的 html 模板文件)。

问题是我希望图像在选项卡上保持不变,直到它关闭;所以不要重新加载

不久前,我发现了一些可以实现这一点的代码,但我不断收到我的变量/函数不是函数的错误。非常感谢任何帮助。

错误是在 magic(tabId); 被“调用”的那一行引发的。

这是 magicpendingTabs 里面的内容

Codebase

let pendingTabs = new Array();

chrome.tabs.onUpdated.addListener(
    function(tabId, changeInfo, tab) {

        //Execute the handler
        const magic = pendingTabs[tabId];
        magic(tabId);
        // Delete the handler
        delete pendingTabs[`foobar`];
});

function sendImages(tabId, response, tabTitle) {
    const urls = response.urls;
    
    chrome.tabs.create({url: chrome.runtime.getURL('html/images.html')}, function(tab) {            


        function handler(tabId) {
            chrome.tabs.sendMessage(tabId, {urls: urls});
        };
        
        pendingTabs[tab.id] = handler;
    });
}

【问题讨论】:

  • 那么,您是否调试过 pendingTabs 实际包含的内容以及传递给您的 onUpdated 处理程序的 tabId 是什么?
  • onUpdated 事件的tabId 是已加载/重新加载的选项卡。 pendingTabs 似乎包含通过上下文菜单打开但尚未关闭的已打开选项卡的 ID。我在我的问题中添加了输出。

标签: javascript google-chrome-extension scope closures


【解决方案1】:

我需要在 magic() 上添加一个 if 来测试它是否未定义,然后错误就奇迹般消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多