2015-05-04 31 views
0

我很抱歉,但我有一個持續性的錯誤,上傳功能工作正常Ajax調用半工作...文件已上傳但JavaScript未執行

function startUp(hash) { 

    $('#file_up_form').ajaxForm({ 
           beforeSend: function(xhr) { 
            xhr.setRequestHeader("X-CSRF-Token", '{{ Session::token() }}'); 
            xhr.setRequestHeader('Sha-Sha',hash); 
            //other stuff 
            }, 

           uploadProgress: function(event, position, total, percentComplete) { 
           //some stuff 
           }, 

           complete : function(xhr) { 
            //some stuff 
           }, 

           error : function(xhr) { 
            //some stuff 
           } 

          }); 
} 

當我打電話這種方式:

$("#start_up_button").on('click', function() { 

     if(checkFile()){ 

      startUp('f4274dd2284704f1158b2cecd71666a37ba5b949f97fc521974f98fa3dd0ea706cca7253244e20f2a4c4c694052097c45260edfe679c9e7b56896858a34839cd'); 
      //getHash(); 
     } 

     else{ 
      $('#myModalerror').modal('show'); 
      $("#myModalerror").css("z-index", "1500"); 
     } 
    }); 

,一切工作正常。 但是,當我取消對第二行和評論首先從調用它:

function getHash(){ 

     input = document.getElementById('fileToUpload'); 

     file = input.files[0]; 
     var reader = new FileReader(); 

     reader.onload = function(e) { 
      var shaObj = new jsSHA(reader.result,"BYTES"); 
      var hash = shaObj.getHash("SHA-512", "HEX"); 
      console.log(hash); 
      startUp(hash); 
     }; 
     reader.readAsBinaryString(file); 

    } 

沒有工作AJAX:在執行console.log顯示正確的哈希值,但沒有頭設置,並沒有從「//一些東西'的作品...但文件上傳! (??)我試圖用

setTimeout(function() { 
          startUp(hash);  
            }, 200); 

打包電話,但Firefox只是崩潰。任何想法 ??

THX

回答

0

ajaxForm()$('#file_up_form').ajaxForm({ ... })的行爲是不觸發AJAX請求。

它是一個事件綁定函數。 (我沒有通過API文檔了,但可能它結合形式提交事件其內庫函數之一)

要真正觸發一個AJAX請求你已經添加HTML裏面<input type="submit" >按鈕<form>,然後點擊它。 (圖書館將防止傳統的表單提交,並通過AJAX提交)

實現示例:

JS:

<script type="text/javascript"> 
$(document).ready(function(){ 
    $("#file_up_form").ajaxForm({ // bind library function to the form 
     beforeSend: function(xhr){ 
      input = document.getElementById('fileToUpload');; 

      file = input.files[0]; 

      if(file){ 
       var reader = new FileReader(); 
       reader.readAsBinaryString(file); 

       var shaObj = new jsSHA(reader.result,"BYTES"); 
       var hash = shaObj.getHash("SHA-512", "HEX"); 

       xhr.setRequestHeader('Sha-Sha', hash); 
      }else{ 
       alert("First, please select a file to upload."); 
       return false; 
      } 
     }, 
     uploadProgress: function(event, position, total, percentComplete){ }, 
     success: function() { }, 
     complete: function(response) { }, 
     error: function() { } 
    }); 
}); 
</script> 

HTML:

<body> 
    <form id="file_up_form" action="upload.php" method="post"> 
     <input type="file" id="fileToUpload" name="uploadedfile" /> 
     <!-- Click on submit to perform AJAX call --> 
     <input type="submit" value="Upload"> 
    </form> 
</body> 
-1

THX ,

但這不能工作,因爲JavaScript是*****不synchrone,我需要強制與reader.onload()回調的同步,然後調用ajax ... ajax請求將被髮送,無論哈希是如果我在裏面.ajaxForm()它已經結束了,即使是setTimeout(function(){...})也是異步本身,所以它沒有效果的ajax請求發送...或者如果我把它放在另一個地方它只是崩潰的Firefox ...

我有一個上傳按鈕來觸發請求,當然,這是唯一的觸發器,我必須首先處理sha-512的計算,然後使用表單綁定觸發ajax。

但我不明白的是:

爲什麼"startUp('ARandomHash');"作品完美地$("#start_up_button").on('click', function() {...});"hash=...; console.log(hash); startUp(hash);"打印內部正確的哈希,但AJAX是一個總的失敗reader.onload()回調裏面......該事件是觸發由同點擊事件,它只有2個執行範圍更多...

我不認爲我失去了這兩個範圍的提交事件更因爲文件上傳正確...它只是beforeSend:..., uploadProgress:...等沒有執行。

我想我就應該努力做投哈希值,它可能是一個字符編碼的問題,它沒有任何意義,否則,它應該失敗爲"startUp('ARandomHash');",以及...

但THX,如果有人有一個更好的主意=)