将消息从内容脚本传递到基于Angular JS的Chrome扩展

时间:2014-05-12 12:22:59

标签: javascript angularjs google-chrome google-chrome-extension

我正在尝试成功注入内容脚本,以便向注入基于AngularJS的Chrome扩展程序发送消息。

注入控制器方法如下所示:

$scope.selectElement = function() {
  // Close the extension window
  window.close();

  window.chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
      console.log(sender.tab ?
                  "from a content script:" + sender.tab.url :
                  "from the extension");
      if (request.greeting == "hello")
        sendResponse({farewell: "goodbye"});
    }
  );

  // Send content script to web page
  window.chrome.tabs.executeScript(null, { file: 'app/bower_components/jquery/jquery.js' }, function() {
    window.chrome.tabs.executeScript(null, { file: 'app/scripts/libs/dom_selector.js' });
  });
};

单击页面后,注入的脚本会调用以下内容:

$(document).click(function(event) {
  console.log($(event.target));
  chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
    console.log(response);
  });
});

此触发(第一条日志消息出现在控制台中),但第二条日志消息只打印undefined

我想也许window.close()可能是问题,但window.chrome.tabs.executeScript来电正常,所以我不确定为什么事件监听器不会被解雇。它在错误的地方吗?我有一种感觉,因为我真的应该只在某处宣布它,对吧?如果它在这样的控制器中,则每次运行该方法时都会设置它,然后每个侦听器将响应一个事件,导致事件响应被多次发送。这是对的吗?

任何AngularJS对此的指导都非常受欢迎......

1 个答案:

答案 0 :(得分:2)

window.close()打破了它。很烦人,因为我需要关闭弹出窗口,以便用户可以在屏幕上选择任何HTML元素。但我可以确认删除该行允许我从听众那里得到回复。