2011-09-09 12 views

回答

3

典型的解決方案,這是對你的代碼,以便分開,那它使用加載數據的部分在一個單獨的函數中,然後從事件中調用。

僞code'ish:

function load() { 
    //load here 
    reader.onload = function(e) { 
     process(e.target.result); 
    } 
} 

function process(result) { 
    //finish working here 
} 
+1

我更喜歡直接使用該函數,而不是將其封裝在匿名函數中,即使用'reader.onload = process'並將'process'函數更改爲'進程(e)',並從內部處理事件(也許用'var filedata = e.target.result')。 – syockit

0

沒有沒有。所有的IO操作都必須在Javascript中是異步的。

使文件操作同步將有效地阻止瀏覽器UI線程凍結瀏覽器。用戶不喜歡那樣。

相反,您需要以異步方式設計您的腳本。用Javascript很容易。

+0

另外,如果你需要在文件讀取時阻止用戶交互,你可以使用'onloadstart'開始阻塞(或'onprogress'以確保它仍然阻塞),但是'onloadend'中的解鎖過程。 – syockit

1
<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.0.min.js"></script> 

<form><input type="file" id="files" name="file" onchange="upload()" /></form> 

function readFile(dfd) { 
    bytes = []; 
    var files = document.getElementById('files').files; 
    if (!files.length) { 
     alert('Please select a file!'); 
     return; 
    } 
    var file = files[0]; 
    var reader = new FileReader(); 

    // If we use onloadend, we need to check the readyState. 
    reader.onloadend = function(evt) { 
     if (evt.target.readyState == FileReader.DONE) { // DONE == 2 
      var content = evt.target.result; 
      //bytes = stringToBytes(content); 
      dfd.resolve(content); 
     } 
    }; 
    reader.readAsBinaryString(file); 
} 

function upload() { 
    var dfd = new $.Deferred(); 
    readFile(dfd); 
    dfd.done(function(content){ 
     alert("content:" + content); 
    }); 
} 
1

由賈尼的答案是正確的,但在一個droparea在一度下探多個文件的情況下,沒有爲每個文件單獨事件(據我所知)。但是這個想法可能被用來通過遞歸來同步加載文件。 在下面的代碼中,我加載了多個文件,並將它們的內容連接成單個字符串以供進一步處理。

var txt="", files=[]; 
function FileSelectHandler(e) { 
    e.preventDefault(); 
    files = e.target.files || e.dataTransfer.files; 
    txt=""; 
    readFile(0); 
} 

function readFile(n) { 
    file=files[n]; 
    var reader = new FileReader(); 
    reader.onload = function() { 
     txt += reader.result; 
    } 
    reader.readAsText(file); 
    if (n<files.length-1) { readFile(n+1); } 
    else { setTimeout(doWhatEver, 100);} 
} 

function doWhatEver(){ 
    outtext.innerHTML=txt; 
}  

最後一個文件還需要一些額外的時間加載。因此,「setTimeout」。

「outtext」是顯示整個字符串的textarea的句柄。在textarea輸出時,瀏覽器不會'解析字符串。這使得不僅可以查看文本,而且還可以查看html,xml等。

相關問題