在 Chrome 中传递消息

Message Passing in Chrome

提问人:sharath 提问时间:8/17/2010 最后编辑:Jacobsharath 更新时间:9/1/2010 访问量:864

问:

对使用内容脚本在 chrome 中传递消息的工作方式有一点疑问。我将 chromium 文档中给出的消息传递默认示例 (http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/messaging/timer/) 修改为如下所示:

弹出式.html

function testRequest() {

  chrome.tabs.getSelected(null, function(tab) {
    chrome.tabs.sendRequest(tab.id, {counter: "getHTML"}, function handler(response) {
      alert("Inside Client = "+response.counter2);
    });
  });
}

我的内容脚本如下所示:

页面.js

chrome.extension.onRequest.addListener(
  function(request, sender, sendResponse) {
    alert(request.counter);
    alert("Inside server .. Req Counter = "+request.counter);
    sendResponse({counter2: "5"});
  });

当我从 popup.html 执行 testRequest 时,内容脚本按预期被调用。我确实收到了我所拥有的两个警报 使用各自的值声明。但是我的弹出.html响应代码似乎没有被调用..我在弹出窗口 .html 内的警报 - 未执行。alert("Inside Client = "+response.counter2);

另一方面,如果我在客户端内有一个调试点,它就可以工作!有点奇怪。.有人可以告诉我这是如何以及为什么发生的吗?

先谢谢你。.

浏览器 谷歌浏览器扩展程序 chromium

评论


答:

1赞 Mohamed Mansour 8/17/2010 #1

您的代码是正确的。我错了我之前说的话。

相信我,当我说这句话时,我很困惑为什么它不起作用。原来我正在 chrome://extensions/ 页面上运行浏览器操作。在 Chrome 扩展程序中,API 不会允许您执行或向该页面发送任何请求。在像 Google.com 这样的普通页面上执行此操作,您将看到弹出窗口。

您不能在弹出页面中显示警报对话框。

这就是为什么你看不到:alert("Inside Client = "+response.counter2); }

如果您想看到它的工作,您可以添加一个控制台记录器并在 Web 检查器中查看它。将警报替换为:console.log(response.counter2);

评论

0赞 sharath 8/17/2010
哦。。还行。。伟大的:)..但我的困惑是,当我开始调试时,警报弹出了。!另外,如果我执行以下操作,而不是弹出响应警报: chrome.tabs.getSelected(null, function(tab) { chrome.tabs.sendRequest(tab.id, {counter: “getHTML”}, function handler(response) { responseCall(response.counter2); });function responseCall(txt) { alert(txt);成功了!但非常不一致。.只是有时会停止工作..但是每当我打开调试时,它都会起作用。我正在做的事情有什么问题吗?
0赞 Mohamed Mansour 8/18/2010
正如我所说,您不能在弹出窗口或后台页面中使用警报(使用控制台)。如果它在调试时确实有效,那一定是需要更正的错误。
0赞 sharath 8/18/2010
隐岐..非常感谢你的回答穆罕默德..真的很感激:)
0赞 Mohamed Mansour 8/22/2010
嗨,PayPal,对不起,但我说的是不正确的。当我尝试你的例子时,我被我所看到的愚弄了。确保在像 google.com 这样的真实页面上运行浏览器操作,它应该可以工作。您无法在扩展页面(安装时刷新扩展)上运行任何脚本或发送请求。
0赞 Greg 9/1/2010 #2

据我所知,只有当弹出窗口打开时,才会出现来自弹出窗口的警报。

调试弹出窗口时会看到警报,因为调试器会使弹出窗口保持打开状态。

我很确定从后台页面创建警报也没有问题。