2016-02-29 86 views
1

我很努力地找到与我的web应用程序进行通信的最佳方式,在我的扩展程序中使用chrome.windows.create打开该应用程序。Chrome扩展程序:将数据发送到使用chrome.windows.create创建的窗口

我已经在内容脚本和后台脚本之间建立了连线。我可以右键单击一个元素并将其值发送到后台脚本,后台脚本创建一个包含我的webapp的窗口。但从那里我不知道如何访问和使用我的web应用程序中的值(它需要将值加载到编辑器中)。

我已经尝试在窗口和选项卡对象上设置fns和vars,但不知何故,一旦Web应用程序加载,它们就会从窗口对象中丢失。 与chrome.tabs.executeScript我可以摆弄dom,但不设置全局变量或'窗口'上的任何东西。

如果没有更好的方法,我想我被迫添加到DOM并选择了一旦我的网络应用程序加载,但它似乎凌乱。我希望有一个更清洁的方法,比如设置一个onLoadFromExtension fn,我的web应用程序可以执行它来获得它所需要的值。

回答

1

我发现了一个方法,经过多次试验和错误,虽然它仍然似乎容易出错。而且它也取决于与已安装的扩展ID相匹配的扩展名,所以如果不能进行硬编码,它将成为另一个需要通过另一个通道的消息(在阅读之后,看起来像可以硬编码,因为它是公钥的散列,所以问题就解决了)......开始觉得操纵DOM不太凌乱...

background.js

var selectedContent = null; 
chrome.runtime.onMessageExternal.addListener(
    function(request, sender, sendResponse) { 
    console.info("------------------------------- Got request", request); 
    if (request.getSelectedContent) { 
     sendResponse(selectedContent);   
    } 
    }); 

Web应用程序

var extensionId = "naonkagfcedpnnhdhjahadkghagenjnc"; 
    chrome.runtime.sendMessage(extensionId, {getSelectedContent: "true"}, 
    response => { 
     console.info("----------------- Got response", response); 
     if(response) { 
     this.text = response; 
     } 
    }); 

manifest.json的

"externally_connectable": { 
    "ids": ["naonkagfcedpnnhdhjahadkghagenjnc"], 
    "matches": ["http://localhost:1338/*"] 
}, 
+0

这种方法的好处是,当我需要编辑的内容发送回延伸,我可以使用相同的路径。 –

+0

这是扩展和想要合作的网页之间通信的标准方法。 – rsanchez

相关问题