【问题标题】:Chrome Extension - tabId and tabIndex undefinedChrome 扩展 - tabId 和 tabIndex 未定义
【发布时间】:2014-02-13 13:39:07
【问题描述】:

我正在创建一个 Chrome 扩展程序。当我尝试获取 tabId 和 tabIndex 时,它们都显示为“未定义”。

这里是 background.js:

chrome.extension.onRequest.addListener(
    function (request, sender)
    {
        if (request.command == "selected-tab")
        {
            chrome.tabs.getSelected(null,
            function()
            {
                // both show as undefined
                alert('sender.tabId: ' + sender.tabId);
                alert('sender.tabIndex' + sender.tabIndex);
            });
        } 
    }
);

这里是 content-script.js:

chrome.extension.sendRequest({ command: "selected-tab", urltext: urlText });

这里是 manifest.json:

{
  "manifest_version": 2,

  "name": "test2",
  "description": "Test2 desc",
  "version": "1.0",

  "permissions": [
    "tabs", "http://*/*", "https://*/*","contextMenus"
  ],

  "background": {
    "scripts":  ["jquery-1.11.0.min.js", "background.js"]
  },

  "content_scripts": [
    {
      "matches": ["http://*/*"],
      "js": ["jquery-1.11.0.min.js", "content-script.js"]
    }
  ]

}

如何在 background.js 中获取当前选项卡的 tabId 和 tabIndex?

提前致谢

更新 #1

在 background.js 中尝试过,但它仍然没有在警报中显示标签 ID:

chrome.tabs.getCurrent(function (tab) {
alert(tab.id);
});

【问题讨论】:

  • 有没有人知道为什么 tabId 和 tabIndex 是未定义的?或者至少指出我正确的方向?谢谢。

标签: google-chrome-extension


【解决方案1】:

chrome.extension.onRequest 事件支持向发送者返回响应的概念,但如果接收者没有回复(或表明它打算),则有一些代码会尝试垃圾收集 JS 上下文设置在您的事件处理程序中。因为您正在处理程序的上下文中通过 chrome.tabs.getSelected 启动另一个异步操作,所以可能是垃圾收集在您的 getSelected 回调触发之前启动。

查看runtime.onMessage的回调参数文档:

"当您有响应时调用(最多一次)的函数。 参数应该是任何 JSON-ifiable 对象。如果您有多个 onMessage 监听器在同一个文档中,那么只有一个可以发送一个 回复。该函数在事件监听时失效 返回,除非您从事件侦听器返回 true 以指示 您希望异步发送响应(这将保留消息 通道打开到另一端,直到调用 sendResponse)。”

一个简单的解决方法是在 getSelected 回调中手动调用 sendResponse:

chrome.extension.onRequest.addListener(
    function (request, sender)
    {
        if (request.command == "selected-tab")
        {
            chrome.tabs.getSelected(null,
            function()
            {
                // both show as undefined
                alert('sender.tabId: ' + sender.tabId);
                alert('sender.tabIndex' + sender.tabIndex);
                sendResponse(); // context can now be GC'd
            });
        }
        return true; // indicates we plan to call sendResponse
    }
);

【讨论】:

    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 2012-09-03
    相关资源
    最近更新 更多