获得“;这个“;Chrome扩展中内容脚本的选项卡ID
Obtaining "this" tab ID from content script in Chrome extension?
从内容脚本中,是否可以访问该选项卡的id
?
我想从内容脚本向后台页面发送消息,该消息告诉我的扩展为";用这个标签做点什么";使用CCD_ 2 API。
需要一个tabID
,当我的内容脚本可以简单地告诉它消息内容中的tabID
时,在后台页面中做一堆逻辑来寻找tabID
是没有意义的。
选项卡id自动传递到MessageSender对象内部:
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
console.log("sent from tab.id=", sender.tab.id);
});
注:根据文档,此属性并不总是可用的:
仅当从选项卡(包括内容脚本)打开连接时,并且仅当接收器是扩展而不是应用程序时,此属性才会出现。
如果你想要自己的tabId
(在我的情况下是在内容脚本中),而不需要"CCD_ 7";权限,解决方法是让Content Script向后台脚本发送一条伪消息,然后让后台脚本用sender.tab.id
回复Content Script!
例如在content.js
:中
chrome.runtime.sendMessage({ text: "what is my tab_id?" }, tabId => {
console.log('My tabId is', tabId);
});
在background.js
:中
chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
if (msg.text == "what is my tab_id?") {
sendResponse({tab: sender.tab.id});
}
});
这是一个愚蠢的变通方法,对我有效。:)
PS。哦,如果你有tabs
权限,那么你可以很容易地运行这个异步查询:
chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
var myTabId = tabs[0].id;
chrome.tabs.sendMessage(myTabId, {text: "hi"}, function(response) {
alert(response);
});
});
如果您使用Ports进行双向长寿命连接,回调中的第二个参数是Port对象,因此访问选项卡ID是:
chrome.runtime.onConnect.addListener(port => {
if (port.name === "foo") {
port.onMessage.addListener((msg, sendingPort) => {
console.log("sent from tab.id=", sendingPort.sender.tab.id);
});
}
});
当前所选答案的更正:
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
console.log("sent from tab.id=", sender.id);
});
如果以编程方式注入内容脚本,另一种方法是将tabId
存储在全局变量中
const injectTabId = (callback) => chrome.tabs.executeScript(
tabId,
{code: `window.tabId = ${tabId}`},
callback
);
const injectFile = () => chrome.tabs.executeScript(
tabId,
{file: 'content.js'}
);
injectTabId(injectFile);
在内容脚本中,使用window.tabId
访问它。变量不会因为内容脚本而暴露于页面脚本生活在一个与世隔绝的世界里。
如果您使用manifest_version: 3
并且以编程方式注入内容脚本,另一种方法是将tabId
存储在全局变量中:
chrome.tabs.onUpdated.addListener(async (tabId, changeInfo, tab) => {
await chrome.scripting.executeScript({
target: { tabId: tabId },
args: [tabId],
func: (id) => {
window.tabId = id;
}
});
await chrome.scripting.executeScript({
target: { tabId: tabId },
files: ['content.js']
});
});
相关文章:
- 选项卡侦听器未被来自后台脚本的消息激活
- Dynamics 2016内部部署Crm客户端脚本.选项集控件类型缺少方法
- 使用java脚本更改onClick事件中菜单选项卡的颜色
- 在服务器端脚本执行后关闭选项卡
- 引导程序动画选项卡内容脚本
- 使用内容脚本中的“简单首选项”打开插件的选项页
- 使用Ajax或JavaScript选择下拉列表选项后,在同一页面上执行PHP脚本
- 编写脚本以关闭其他选项卡或浏览器
- ExternalInterface为我提供了在使用多个参数时停止脚本的选项.为什么?
- Javascript:更改<选择>java脚本中的选项
- 如何防止用户使用浏览器选项禁用脚本
- 设置间隔未在选项卡内容脚本中调用
- 如何创建一个“下一步”按钮,使用 Java 脚本和 Twitter Bootstrap 切换选项卡
- 我们是否有任何通用脚本/ jquery插件可以在通过ajax选项卡加载的内容上应用javascript
- 如何在同一选项卡中打开新脚本
- Chrome扩展-重定向当前选项卡后重新运行扩展脚本
- 从内容脚本打开chrome选项卡
- jQuery选项卡的自定义脚本
- 在脚本选项中更改字体
- Firebug:在脚本选项卡中调试期间打开控制台