Google chrome extension 通过chrome.downloads传递消息

Google chrome extension 通过chrome.downloads传递消息,google-chrome-extension,Google Chrome Extension,我正在开发一个Chrome扩展。我有一个内容脚本和一个事件页面。在内容脚本中,我使用chrome.runtime.sendMessage()将消息发送到事件页面。在事件页面上,我使用onMessage事件监听器发回一个响应——但是,我希望在chrome检测到一个文件已经开始下载后发送这个响应 contentScript.js window.location.href = download_link; //redirecting to download a file chrome.run

我正在开发一个Chrome扩展。我有一个内容脚本和一个事件页面。在内容脚本中,我使用chrome.runtime.sendMessage()将消息发送到事件页面。在事件页面上,我使用onMessage事件监听器发回一个响应——但是,我希望在chrome检测到一个文件已经开始下载后发送这个响应

contentScript.js

window.location.href = download_link; //redirecting to download a file    

chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
    console.log(response.farewell);
});
eventPage.js

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {

    chrome.downloads.onCreated.addListener(function(DownloadItem downloadItem) {
        sendResponse({farewell: "goodbye"});

        return true;
    });

});
现在,我还没有尝试过chrome.downloads.onCreated listener,但我假设这是正确的语法。但是,代码不起作用,控制台返回此错误:

Error in event handler for (unknown): Cannot read property 'farewell' of undefined
Stack trace: TypeError: Cannot read property 'farewell' of undefined
    at chrome-extension://dlkbhmbjncfpnmfgmpbmdfjocjbflmbj/ytmp3.js:59:31
    at disconnectListener (extensions::messaging:335:9)
    at Function.target.(anonymous function) (extensions::SafeBuiltins:19:14)
    at EventImpl.dispatchToListener (extensions::event_bindings:395:22)
    at Function.target.(anonymous function) (extensions::SafeBuiltins:19:14)
    at Event.publicClass.(anonymous function) [as dispatchToListener] (extensions::utils:65:26)
    at EventImpl.dispatch_ (extensions::event_bindings:378:35)
    at EventImpl.dispatch (extensions::event_bindings:401:17)
    at Function.target.(anonymous function) (extensions::SafeBuiltins:19:14)
    at Event.publicClass.(anonymous function) [as dispatch] (extensions::utils:65:26)

我在没有chrome.downloads.onCreated监听器的情况下尝试了这个方法,它可以工作,响应由内容脚本获取。我在网上看到你需要添加返回true为了让它工作,但它对我不起作用。我怀疑这是因为第二个事件侦听器进入了一个新的作用域,这意味着无法从那里调用sendResponse——如果是这种情况,我如何调用sendResponse函数?

返回true来自错误的位置

这意味着“我还没有调用
sendResponse
,但我要去”

但是,您正在从
onCreated
回调中返回它-此时为时已晚,因为在添加侦听器之后,您的原始
onMessage
处理程序立即终止。您只需移动线路:

chrome.runtime.onMessage.addListener( function(request, sender, sendResponse) {
    chrome.downloads.onCreated.addListener( function(DownloadItem downloadItem) {
        sendResponse({farewell: "goodbye"});
    });
    return true;
});

为什么要在
chrome.runtime.onMessage
监听器中定义
chrome.downloads.onCreated
监听器?我不知道如何使用它——我不熟悉chrome扩展事件页面,所以我不确定如何正确地执行此操作。我还可以在需要时调用从内容脚本创建的chrome.download.onCreated吗?刚刚尝试过,我仍然会遇到相同的错误,即它无法读取属性“再见”。啊,请注意,您也在注册处理程序之前启动下载(你可能不想在每次下载时都注册它,而是只注册一次)哦,谢谢,我没有注意到。不过,我还是遇到了同样的错误:(你知道实现这一点的另一种方法吗?我只想在我的内容脚本中知道何时开始下载。这将是一个不同的问题,可能不太适合堆栈溢出。最终它成功了!问题是事件侦听器
一旦创建
,似乎永远不会触发??我尝试了
onDeterminingFilename事件侦听器,它就像一个符咒:)