javascript - Firefox 中的类似事件 onDeterminingFilename

标签 javascript firefox-addon dom-events

我开发了一个 Chrome 扩展程序,我在其中为 onDeterminingFilename 事件添加了一个监听器,它会检查下载文件名是否为特定格式,然后将其重命名并在另存为中显示。对话框。

现在我想在 Firefox 中开发一个类似的扩展,但我找不到任何可以在文件下载完成之前触发的事件。如果没有这样的事件,任何人都可以建议如何在之前以编程方式重命名文件开始下载?

编辑 1 : 正如 antoyo 所建议的,我已经更新了代码

在这里,我可以创建一个新的下载,以相同的 URL 和不同的文件名开始,但不能取消现有的下载。我不希望用户下载同一个文件两次。

调用 cancel() 什么都不做。如何取消正在进行的下载?

或者有没有办法在添加到下载摘要之前访问下载文件?

var self = require('sdk/self');
const { Cc, Ci, Cu } = require('chrome');
Cu.import("resource://gre/modules/Downloads.jsm");
Cu.import("resource://gre/modules/osfile.jsm")
Cu.import("resource://gre/modules/Task.jsm");

Downloads.getList(Downloads.PUBLIC).then(function(downloadList) {
    downloadList.addView({
        onDownloadAdded: function(download) {
            var fname = download.target.path;
            var url = download.source.url;
            download.cancel();

            // check if name is not be changed
            if (true){
              label = "filename.txt";      
              d_path = "/home";            

              Task.spawn(function () {
                yield Downloads.fetch(url, OS.Path.join(d_path, label));
              }).then(null, Cu.reportError);
            }

            download.start().then(function(){
              console.log("start");
            });
            download.launch().then(function(){
              console.log("launch");
            });
            download.whenSucceeded().then(function() {
                console.log('WhenSucceeded');                    
            });
        },
        onDownloadChanged: download => console.log("Changed", download),
        onDownloadRemoved: download => console.log("Removed", download)
    });
});

最佳答案

您可以使用 Downloads.jsm 解决您的问题模块。

要观察下载事件,您需要在 DownloadList 上添加一个 View .

之后,您可以使用 Download 做任何您想做的事对象。

这是一个示例代码,使用附加 SDK:

const { Cu } = require('chrome');

Cu.import('resource://gre/modules/Downloads.jsm');
Cu.import('resource://gre/modules/osfile.jsm');
Cu.import('resource://gre/modules/Task.jsm');

Downloads.getList(Downloads.PUBLIC).then(function(downloadList) {
    downloadList.addView({
        onDownloadAdded: function(download) {
            download.cancel();

            let filename = download.target.path;
            let url = download.source.url;
            let name = 'filename.txt';
            let directory = '/home';

            Task.spawn(function() {
                yield Downloads.fetch(url, OS.Path.join(directory, name));
            }).then(null, Cu.reportError);
        },
    });
});

这将取消所有新下载并开始新下载。

关于javascript - Firefox 中的类似事件 onDeterminingFilename,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32145318/

相关文章:

javascript - 由于 'lifting state up',无法访问事件对象

javascript - 如何以编程方式从 anchor 标记调用 onclick() 事件,同时在 onclick 函数中保留 ‘this’ 引用?

javascript - 递归函数中断

javascript hover css 改变颜色

javascript - 通过 Firefox 扩展检查网络连接

javascript - 从 Mozilla 扩展(使用标准 I/O 通信)运行二进制文件的推荐方法?

javascript - Safari 扩展 : Event for a completely new tab?

javascript - Bootstrap 工具提示在内容较大的表格单元格中偏离中心

javascript - asp.net mvc 将 Json 对象从 View 传递到 Controller

css - 将滚动条添加到 firefox 扩展的侧边栏