Chrome扩展程序 - tabId和tabIndex未定义

时间:2014-02-13 13:39:07

标签: google-chrome-extension

我正在创建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);
});

1 个答案:

答案 0 :(得分:0)

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

请参阅有关runtime.onMessage的回调参数的文档:

  

"有响应时调用(最多一次)的函数。该   参数应该是任何可以使用JSON的对象。如果你有多个   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
    }
);