【发布时间】:2013-06-27 01:30:24
【问题描述】:
我目前正在使用 Chrome 扩展程序,但找不到方便的解决方案将消息从后台上下文(我们称之为 BG)发送到注入脚本的上下文(让称之为INJ)。将消息从 INJ 发送到 BG 就像一个魅力。但我希望 BG 执行 XMLHttpRequest,这可能需要一些时间,所以我想将此请求的评估发送给 INJ。
很遗憾,我不允许在 INJ 的上下文中注册侦听器。所以我能想到的最佳解决方案包括:
- 从INJ向BG发送消息,触发
XMLHttpRequest - 请求一返回BG就在本地存储请求的结果
- INJ 反复向 BG 发送更多消息,询问结果,除非 BG 以结果回答。
可能是这样的:
INJ:
function whaitForResult ()
{
chrome.runtime.sendMessage ({method: "getResult"}, function (response)
{
if (response.finished === "true")
// request finished, lets go on
else
setTimeout(whaitForResult, 100);
}
}
chrome.runtime.sendMessage({method : "triggerRequest"}, function(response) {});
whaitForResult ();
背景:
chrome.runtime.onMessage.addListener (function(request, sender, sendResponse)
{
if (request.method == "triggerRequest")
{
// startXMLHttpRequest ();
sendResponse ({});
return true;
}
else if (request.method == "getResult")
{
if (finishedXMLHttpRequest ())
sendResponse ({finished:"true", result: resultFromXMLHttpRequest ()});
else
sendResponse ({finished:"false"});
return true;
}
});
我想这应该可行,但在我看来它很混乱。所以我的问题是:有没有一种方便的方法可以向注入的脚本发送消息?
如果我的扩展概念很垃圾,请提出替代方案。但是要执行XMLHttpRequest,我需要来自localStorage 的一些变量,并且由于这些数据非常敏感,我不想将这些变量传递给INJ 的上下文。因此,在 INJ 中执行XMLHttpRequest 不是一种选择。
【问题讨论】:
标签: javascript google-chrome-extension xmlhttprequest message-passing