javascript - 选项卡 url 更改后从后台回调到内容脚本

标签 javascript google-chrome google-chrome-extension tabs

我是 Chrome 扩展新手,遇到了问题。 单击扩展程序的图标时,我运行脚本:

chrome.browserAction.onClicked.addListener(function(tab) { 
    chrome.tabs.executeScript({
        "file": "enterIonis.js"
    });
});

此脚本从打开的选项卡中获取一些信息,然后更改选项卡 URL 以加载新页面。然后,该脚本需要等待新页面完全加载才能与其交互。为此,它打开一个端口并向使用 chrome.tabs.onUpdated 监听器的后台页面发送消息。后台页面应该向内容脚本发送消息/回调,告诉它现在可以与选项卡交互。

background.js:

var _port;
var goodUrl;


chrome.runtime.onConnect.addListener(function(port) {
  console.assert(port.name == "enterIonis");
  port.onMessage.addListener(function(msg) {
        goodUrl = msg.url;
        _port = port; 
    });
});

chrome.tabs.onUpdated.addListener(function ( tabId, changeInfo, tab ){ 
  if ( changeInfo.status === "complete" ){

    chrome.tabs.query({'active': true, 'lastFocusedWindow': true}, function (tabs) {
        var currentUrl = tab.url;
        if(currentUrl == goodUrl){
            //should send a callback to content script here
            _port.postMessage({result: "ok"});
        }
    }); 

  }
});

content_script.js

//interacting with DOM elements
...

// sending a message to background.js
var port = chrome.runtime.connect({name: "enterIonis"});
port.postMessage({url:href});
port.onMessage.addListener(function(msg){
    // here is where the message from the background telling the tab is ready should arrive
    alert(msg.result);
});

问题是,当我尝试使用第一条消息中的端口时,出现以下错误:响应 tabs.query 时出错:错误:尝试使用已断开连接的端口对象

如何重新连接端口?或者还有其他方法可以实现我的目标吗?

最佳答案

tabs.executeScript()注入(inject)到页面中,而不是持久地注入(inject)到选项卡中

您必须单独将内容脚本注入(inject)新页面。使用 tabs.executeScript() 注入(inject)脚本不会将脚本注入(inject)到选项卡中,该脚本在加载新网页时会持续存在于该选项卡中。它将脚本注入(inject)到当前显示在指定选项卡中的页面中。一旦该页面不再显示在该选项卡中,内容脚本就不再存在。

您说您的脚本“更改选项卡网址以加载新页面”,然后应该执行其他操作,但它没有执行。一旦新页面开始加载,您注入(inject)的内容脚本的上下文就会与旧网页的上下文一起被销毁。新页面加载后,您的内容脚本无法向后台脚本发送消息,因为您的内容脚本不再存在。

关于javascript - 选项卡 url 更改后从后台回调到内容脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41203264/

相关文章:

google-chrome - 固定背景图像时,chrome 中的滚动不连贯

google-chrome - 类型错误 : Cannot read properties of null (reading 'CodeMirror' )

javascript - 透明按钮无法在 Firefox 和 IE 中单击,但在 Chrome 和 Safari 中可以正常工作

google-chrome-extension - 如何为正在打开的页面禁用 javascript?

javascript - 远程表单中的远程链接 - ajax 回调仅用于提交

javascript - 将字符串转换为格式不正确的 JS 对象

javascript - 使用 Cheerio 获取元素内部的元素

javascript - 单击 LI 时单击链接

javascript - 我必须调用 sendResponse 吗?

python - 使用带有扩展名(.crx 文件)的 Python 运行 Selenium WebDriver