如何使用下载属性下载多个音频文件?

时间:2017-02-02 00:04:16

标签: javascript html audio

我想知道我是否可以从谷歌单词发音中下载所有音频文件

我提出了一个实际可行的解决方案

我创建了一个包含以下代码的html页面

<a id="mylink" href='//ssl.gstatic.com/dictionary/static/sounds/de/0/word.mp3' download='word.mp3'>download audio "word"</a>

现在,如果您单击上面的链接,浏览器将开始下载音频文件  如果你将word.mp3更改为其他内容并再次单击它, 它将开始下载新单词;

问题是我试图以mp3格式下载整个字典。

所以我想出了以下javascript

var words=['cat','fish','police','office','ball'];//the whole dictioany.....
for(var z in words )
setTimeout(function(){
var lin=document.querySelector("a");//gets the above link
lin.href="//ssl.gstatic.com/dictionary/static/sounds/de/0/"+a[z]+".mp3";//changes link href to each of the array "words"
lin.download=a[z]+".mp3";//changes the file name to current word
lin.click();//after clicking this link , all downloads start at the same time 
},1000)//even it setup to fire after 1 second
//all the downloads start at same time 

最大的问题是只下载的音频文件是最后一个&#34; ball&#34;

并且已多次下载 任何解决方案都表示赞赏,并提前感谢

这是关于jsfiddle click

的示例

2 个答案:

答案 0 :(得分:0)

您不能在循环中使用setTimeout(),因为循环执行速度会超过超时。因此,将为循环中的每个事件运行最终结果(a[z]将调用a[4]五次)。要解决这个问题,您需要稍微修改for循环,而不是使用超时:

var a = ['cat', 'fish', 'police', 'office', 'ball'];
for (var z = 0; z < a.length; z++) {
  var l = document.querySelector("a");
  l.href = "//ssl.gstatic.com/dictionary/static/sounds/de/0/" + a[z] + ".mp3";
  l.download = a[z] + ".mp3";
  l.click();
}

我创建了一个更新的小提琴,展示了这个here

希望这有帮助!

答案 1 :(得分:0)

您的代码存在以下问题:

  1. minutes= raw_input('Enter the number of minutes: ') def minutes_to_years_days(minutes): ydec=minutes/60/24/365 y=int(ydec) ddec=(minutes-y*365*24*60)/60/24 d=int(ddec) sentence= '{} is approximately {} years and {} days.'.format(minutes,y,d) print minutes_to_years_days() 几乎在同一时间内在循环内执行。这就是为什么函数也同时执行的原因。想想有10个鸡蛋计时器,你们都可以同时激活。他们也会同时响起。
  2. setTimeout触发的函数使用函数外部声明的变量setTmeout。它在执行z时不使用z的值,但在执行函数时不使用setTimeout的值。该函数的所有实例都访问同一个变量,因此它们在最后一个循环中都使用z的值。
  3. 不是使用循环,而是使用setInterval以给定间隔执行函数并使用counter变量,以便在每次执行函数时使用不同的变量。

    function run()
    {
      var words=['cat','fish','police','office','ball'];
      var counter = 0;
    
      // Setup IntervalFunction to run every 2 seconds
      var interval = setInterval(IntervalFunction, 2000);
    
      function IntervalFunction()
      {
        // Download word
        downloadWord(words[counter]);
    
        // Increase counter
        counter++;
    
        // When counter is beyond array, stop IntervalFunction from running
        if(counter >= words.length)
        {
            clearInterval(interval);
        }
      }
    }
    
    function downloadWord(word)
    {
        var lin = document.querySelector("a");
        lin.href = "https://ssl.gstatic.com/dictionary/static/sounds/de/0/" + word + ".mp3";
        lin.download = word + ".mp3";
        lin.click();
    }