2012-03-14 23 views
4

upload.onprogressが別の機能になっていると正しく動作しない理由を知っている人は誰ですか?xmlhttprequestが正常に機能しない

コード(プログレスバーがゆっくりと動いて)正常に動作:

 xhr.upload.onprogress = function(e) { 
      if (e.lengthComputable) { 
       progress.value = (e.loaded/e.total) * 100; 
      } 
     }; 

が、私は機能にそれを置けば、それはもう動作しません。第二のコードで

xhr.upload.onprogress = uploadProgress(event); 

function uploadProgress(e) { 
    if (e.lengthComputable) { 
     progress.value = (e.loaded/e.total) * 100; 
    } 
} 

、進捗状況ファイルのアップロードが完了してから100%にジャンプします。アップロード中に100%にうまく移動します。


私は、提供されたソリューションを試しました。それを関数の外に置く方法はありませんか? uploadProgress(event);

 function uploadFile(blobFile, fileName) { 
      ... 
      ... 

      // Listen to the upload progress for each upload. 
      xhr.upload.onprogress = uploadProgress; 

      // Progress Bar Calculation why it has to be in uploadFile function.. 
      function uploadProgress(e) { 
       if (e.lengthComputable) { 
        progress.value = (e.loaded/e.total) * 100; 
       } 
      }        

      uploaders.push(xhr); 
      xhr.send(fd); 
     } 

     //it does not work if I put it outside the function. is there anyway to do this? 
     function uploadProgress(e) { 
      if (e.lengthComputable) { 
       progress.value = (e.loaded/e.total) * 100; 
      } 
     } 

答えて

6

もし関数自体を呼び出し、コールバック関数としてそれを割り当てるxhr.upload.onprogressに戻り値を代わりに割り当てる:使用すべき

xhr.upload.onprogress = uploadProgress; 
+0

// Listen to the upload progress for each upload. xhr.upload.onprogress = uploadProgress; // Progress Bar Calculation function uploadProgress(e) { if (e.lengthComputable) { progress.value = (e.loaded/e.total) * 100; } } 

をあなたは正しかった。..変数進展は)uploadFile(内部にあります。それがうまくいかない理由です。 JavaScriptの優れた習慣は、関数の内部で関数として作るのではなく、何とかひどく見えるでしょう。 のため、var progress = document.createElement( 'progress'); はuploadFile()内にある必要があり、呼び出されるたびにいくつかのプログレスバーが生成されます。だから私はそれをグローバルにすることはできませんvar – Harts

+0

@ user1096900あなたは無名関数 'xhr.upload.onprogress = function(e){}'または匿名ラッパー関数を使うことができます: 'xhr.upload.onprogress = function(e ){uploadProgress(e、progress);} '。 – ComFreek

1

第2の例で

xhr.upload.onprogress = uploadProgress; 

not

xhr.upload.onprogress = uploadProgress(event); 

関数への参照ではなく、関数の呼び出しの結果を割り当てました。

+0

@ComFreek私はそれを試みましたが、それでも正しく動作しません。各チャンクのアップロードが完了した後も、そのまま100%にジャンプします。 – Harts

+0

関数の後ろにxhr.upload.onprogress行を置くと、コードが巻き上げられる可能性があります。 – leebriggs

+0

@ComFreek、私の更新されたコードをご覧ください。だから、それを関数の外に置くのはとにかくあるのだろうか?それとも不可能なのでしょうか?ありがとうございます – Harts

1

コールバックとして割り当てる前に関数を定義するのはどうですか? 後で関数を定義するときに、JavasCriptで問題が発生することがあります。

私はあなたが交換することができます意味:

// Progress Bar Calculation 
function uploadProgress(e) { 
    if (e.lengthComputable) { 
     progress.value = (e.loaded/e.total) * 100; 
    } 
} 
// Listen to the upload progress for each upload. 
xhr.upload.onprogress = uploadProgress; 
関連する問題