我正在尝试成功注入内容脚本,以便向注入基于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对此的指导都非常受欢迎......
答案 0 :(得分:2)
window.close()
打破了它。很烦人,因为我需要关闭弹出窗口,以便用户可以在屏幕上选择任何HTML元素。但我可以确认删除该行允许我从听众那里得到回复。