当我想下载时,我在哪里可以正确使用 API“chrome.downloads”?
Posted
技术标签:
【中文标题】当我想下载时,我在哪里可以正确使用 API“chrome.downloads”?【英文标题】:Where can I properly use the API "chrome.downloads" when I want to download? 【发布时间】:2022-01-23 05:15:46 【问题描述】:Ⅰ.简介
我读了很多书,也尝试了各种使用chrome.downloads
API 的方法。但是直到现在,我仍然无法找到使用chrome.downloads
API 的方法。
the docs 的指示似乎对我没有多大帮助。所以我决定来这里询问并向大家介绍我面临的问题。我希望它可以帮助很多人。
我的项目使用清单版本 3。
这里是项目的 GitHub 链接:https://github.com/ATU8020/Use-API-chrome.downloads.git
Ⅱ.提出问题
用到了一些相关的概念:
-
服务人员
内容脚本
异步函数
同步功能
问题
我知道服务工作者需要同步函数。
监听器必须从页面开始同步注册。 LINK
不要异步注册监听器,因为它们不会被正确触发。 LINK
但是chrome.downloads.download
API 返回一个Promise
:
See chrome.downloads
docs.
这让我很困惑。我还尝试了其他一些方法,例如使用内容脚本。但是在阅读文档后,我知道 API chrome.downloads
不能直接使用。
See content script docs.
评论
这是我问题的症结所在。任何有建设性的 cmets 和有用的信息都会受到赞赏。
Ⅲ.更多信息
如果在文件 popup.js
中使用 API chrome.downloads
就可以了,那是什么意思?
我知道这可能是另一种解决方案。
但是,如果您想在单击contextMenu
时执行download
之类的操作,该怎么办?有可能吗?
【问题讨论】:
使用onMessage
/sendMessage
在不同的上下文之间进行通信。例如,如果您在不支持.downloads
的上下文中显示按钮,则使用消息传递与支持.downloads
的上下文进行通信,然后使用该上下文进行实际下载。
@Ouroborus 问题是你说APIchrome.downloads
可以使用的上下文是什么?
扩展控制下的任何上下文。这通常是背景、弹出窗口和内容脚本。 (这不包括通过例如直接在页面中创建和插入脚本元素而注入页面的脚本。)请注意,许多用于扩展的函数返回承诺。您需要熟悉异步编程才能使用它们。
@Ouroborus "content-script" 当作为 API chrome.scripting
插入时在我的情况下也不起作用,我试过了。
是的,那是注入,而不是内容脚本。内容脚本在清单中声明并自动处理。
【参考方案1】:
该方法返回 Promise 的事实与侦听器注册的方式无关。 您可以在后台脚本中调用监听器内部的异步代码。
忽略结果:
chrome.contextMenus.onClicked.addListener(info =>
chrome.downloads.download(url: info.linkUrl);
);
使用结果:
chrome.contextMenus.onClicked.addListener(async info =>
const downloadId = await chrome.downloads.download(url: info.linkUrl);
console.log('downloadId:', downloadId);
);
注意:chrome.runtime.onMessage
侦听器还不能使用 async
函数,more info。
【讨论】:
我不明白您的解决方案在我的情况下是如何工作的。我已经尝试过,但仍然没有得到预期的结果。可以的话,请详细解释一下,让我理解。 如果你觉得有必要的话,这个项目非常简单。 github.com/ATU8020/Use-API-chrome.downloads 我猜你的集成不正确,所以在问题的末尾显示你的最终代码。 github.com/ATU8020/Use-API-chrome.downloads/blob/main/… 在 *** 上,所有相关的代码/信息都应该在问题内。以上是关于当我想下载时,我在哪里可以正确使用 API“chrome.downloads”?的主要内容,如果未能解决你的问题,请参考以下文章