如何捕获chrome扩展中的下载进度

时间:2014-10-03 13:16:32

标签: jquery google-chrome google-chrome-extension

我正在创建一个Chrome扩展程序,它可以显示下载进度。我能够捕获下载开始并下载完整的事件,但不知道如何获得改变的进度?请帮忙。 下面是我的下载监听器

function AddDownloadListener() {
    //--------------------------------------------------------------------------------------------------------------

    chrome.downloads.onCreated.addListener(DownloadCreated);
    chrome.downloads.onChanged.addListener(DownloadChanged);



    function DownloadCreated(el) {
        console.log("Download Begins");
        console.log(el);
        mobjPortToFoxtrot.postMessage({ message: "Download Begins", element: el });
    }
    //--------------------------------------------------------------------------------------------------------------
        function DownloadChanged(el) {
        if (el.danger === undefined || el.danger == null) {
            console.log(el.state.current);
            mobjPortToFoxtrot.postMessage({ message: el.state.current, element: el });
        }
        else {
            console.log("dangerous content");
            mobjPortToFoxtrot.postMessage({ message: "dangerous content", element: el });
        }
        console.log(el);
    }
}

1 个答案:

答案 0 :(得分:3)

你不能以基于事件的方式这样做。

来自onChanged documentation(强调我的):

  

DownloadItem的任何属性bytesReceivedestimatedEndTime 之外的任何内容发生更改时,此事件将使用downloadId和包含的对象触发改变的属性。

这意味着Chrome不会针对下载进度触发事件,这种情况有道理:这种情况经常发生变化,您不希望在每个网络数据包之后触发事件。

由您决定以合理的速率(即每当有活跃下载时每秒)进行一次这样的事情:

// Query the proportion of the already downloaded part of the file
// Passes a ratio between 0 and 1 (or -1 if unknown) to the callback
function getProgress(downloadId, callback) {
  chrome.downloads.search({id: downloadId}, function(item) {
    if(item.totalBytes > 0) {
      callback(item.bytesReceived / item.totalBytes);
    } else {
      callback(-1);
    }
  });
}