我正在寻找一种方法来确定Google Chrome扩展程序中给定标签的开启者(父标签)。
我查看了Tab的文档,但似乎没有任何可以产生这些信息的东西。 http://code.google.com/chrome/extensions/tabs.html
我已尝试将此内容脚本注入页面(我认为可以将值传递到我的后台页面):
alert(window.opener);
..但它只是产生了空。
到目前为止,我提出的最好的方法是跟踪当前关注的选项卡,每当创建新选项卡时,只需假设关注选项卡是新选项卡的开启者/父级。我相信,由于背景标签很少(允许)打开新页面,所以事实上大部分时间都能正确识别父标签。但是,它似乎有点麻烦且有时可能不准确 - 例如,如果另一个扩展程序打开了一个新标签,此方法可能会错误地标识新标签的开启者。
答案 0 :(得分:7)
更新:现在可以使用新添加的webNavigation API,特别是通过挂钩onCreatedNavigationTarget事件,可靠地确定Chrome扩展程序中的标签页面开启工具标签。
https://code.google.com/chrome/extensions/trunk/webNavigation.html
答案 1 :(得分:2)
Chrome已添加了一个实验性扩展API,可以实现此目的 - 特别是webNavigation.onBeforeRetarget。 http://code.google.com/chrome/extensions/experimental.webNavigation.html
然而,由于这仍然是实验性的(不能在Chrome稳定版本中使用或在Chrome网上应用店中可以发布),我最终还是采用了其他方法。
基本上:
在content_script.js中:
chrome.extension.sendRequest({
request: {
op: "pageLoadStarted",
url: document.location.href,
referrer: document.referrer
}
});
在background.html中:
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
console.log('onRequest: ' + JSON.stringify(request));
console.log(JSON.stringify(sender));
});
此方法允许我获取标签的引荐来源,然后我可以将其与现有标签的网址相关联。这并不总是一对一的映射,所以我做了一些额外的魔术,比如如果它的url与新标签的引用者匹配,则首选当前选择的标签作为开启者。
通过webNavigation.onBeforeRetarget或window.opener,这实际上只是一个非常简单和准确的功能。
答案 2 :(得分:1)
进一步的调查显示,当您认为onCreatedNavigationTarget()不会始终时,它会指示开启者打开的关系。
有时可以在.openerTabId参数中的chrome.tabs.onCreated / onUpdated返回的Tab对象中找到其他提示。
全面的解决方案可能必须依赖于这些答案中描述的多种方法。
答案 3 :(得分:1)
port.onMessage.addListener(
function(msg) {
var tabid = port.sender.tab.openerTabId;
console.log("Received message from tab that was opened by tab id : " + tabid);
// reliably shows the tab id of the tab that opened
// the tab sending the message
});