1

Opera 12 のファイル リーダー API を使用して複数のローカル ogg オーディオ ファイルを読み込もうとしています。それらをデータ URL に変換し、後でアクセスする予定の配列に格納します。

    function music(list)
    {
        var playlistlength=0;
        try
        {
           for (var temp=0; temp < list.files.length; temp++)
           {
             f[playlistlength][0] = list.files.item(temp).name;
             var freader = new FileReader();
             freader.onload = function(frevent){
                                      f[playlistlength][1]=frevent.target.result;
                                               };
             freader.readAsDataURL(list.files[temp]);
             playlistlength++;
           }
        }
        catch(e)
        {
           alert("Error");
        }
     }

ただし、デバッガーで検査すると、 for ループではステートメントが実行されず、 catch ブロックにジャンプして、それを理解できません。前もって感謝します。

4

1 に答える 1

0

これは jsFiddle で動作します。私はあなたのコードから作ったのですが、あなたの使い方は似ていますか?

HTML :

   ​&lt;input type="file" id="browser"/>​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

Javascript :

   function music(list)
   {
     var playlistlength=0;
      var f = new Array();
     try
     {
       for (var temp=0; temp < list.files.length; temp++)
       {
         var music = new Array();
         music[0] = list.files.item(temp).name;
         var freader = new FileReader();
         freader.onload = function(frevent){
           music[1]=this.result;
           f.push(music);
           alert(f);
         };
         freader.readAsDataURL(list.files[temp]);
         playlistlength++;
       }
       alert(f);
     }
     catch(e)
     {
        alert(e);
     }
   }

   function FileSelectHandler(e) {
     var list = e.target || e.originalEvent.dataTransfer;
     music(list);
   }

   document.getElementById("browser").onchange = FileSelectHandler;

なぜうまくいかなかったのですか?

  • 最初に f[playlistlength][1] に値を設定しようとしました。これは、playlistlength++ の後に onload 関数が非同期に実行されたためです。この参照が存在しなかったため、クラッシュしました。
  • f の宣言はおそらく間違っていた </li>
于 2012-07-09T15:14:56.317 に答える