2015-10-29 2 views
1

Я пишу простой скрипт, который будет читать .txt-файл. У меня было довольно много проблем с тем, чтобы он работал, теперь я бы хотел его обновить. В основном я ищу вариант, который остановил бы программу, пока файл не будет открыт и не будет прочитан. Я попытался поместить время(), ожидая изменения какой-либо переменной, но при этом останавливает всю программу - делает невозможным щелчок по открытому файлу.Простая программа javascript, читающая файл

HTML:

<html> 

<head> 
</head> 

<body> 
<input type="file" id="fileInput"> 
<script src="1dn.js"></script> 
</body> 

</html> 

Javascript:

var string; 

window.onload = function() { 

var fileInput = document.getElementById('fileInput'); 

fileInput.addEventListener('change', function(e) {  

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

    reader.onload = function(e) {     

     string = reader.result;    
     alert(string); 

    } 

    reader.readAsText(file); 

}); 

} 

*** wait here until file is opened and read 

*** do some other stuff 
+0

Вы можете использовать вызов AJAX, чтобы проверить, существует ли файл, а затем в функции обратного вызова 'success', прочитать асинхронный файл. Это предотвратит замораживание браузера – Tgsmith61591

+0

Нет, вы не можете остановить выполнение javascript. Просто делайте все «другие вещи» в обратном вызове onload. – Bergi

ответ

-1

Ну, если вы заключаете в функции весь код, который должен быть выполнен только после того, как файл открыт и читать, он будет разобран, но не выполняются до вызова функции.

Затем вызовите свою функцию в конце вашего обратного вызова (функция, заданная в аргументе вашего прослушивателя событий).

EDIT: извините место, которое я положил restOfCode() не понял. Он должен быть внутриonload callback.

Вы не сможете избавиться от прослушивателя событий при вводе файлов, так как браузер фактически не позволит вам получить доступ к локальному файлу на стороне клиента, если он не вызван действием пользователя. Это мера безопасности для предотвращения доступа злонамеренных веб-сайтов к файлам посетителей без их согласия.

Результат:

var string; 

window.onload = function() { 

    var fileInput = document.getElementById('fileInput'); 

    // You need user input for the browser to allow you reading local files. 
    // This is a security measure to protect the user. 
    fileInput.addEventListener('change', function(e) {  

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

     reader.onload = function(e) {     

      string = reader.result;    
      alert(string); 

      // At this point only you are sure your file is opened and read. 
      restOfCode(); 
     } 

     // Open the file and start reading. 
     reader.readAsText(file); 
    }); 
} 

// *** wait here until file is opened and read 
// the function below is parsed but not executed, since it is not called 

function restOfCode() { 
    //*** do some other stuff 
} 
-1

Вы можете использовать библиотеку, которая добавляет when функцию, или вы можете реализовать его самостоятельно в чистом JS, если вы предпочитаете:

function when(conditionFunc, execFunc, interval) { 
    if (conditionFunc()) { 
     execFunc(); 
    } else { 
     setTimeout(function() { when(conditionFunc, execFunc, interval);}, interval); 
    } 
} 

Вы можете read more about the function here. Используйте его так:

when(function() { 
    return string; 
}, function() { 
    // do stuff 
}, 500); 

Если вы хотите // do stuff выполнять всякий раз, когда строка изменяется, просто изменить return string; с условием, что сравнивает новое значение строки со старым значением строки.

+0

Почему downvote? – jperezov

+0

Спасибо всем за ваши ответы! Я уже использую решение Ghybs, то есть я вызываю функцию onload. Я немного тороплюсь, поэтому думаю, что я сохраню это решение (когда решение будет выглядеть хорошо, но я просто вне времени). Поскольку имя и расположение файла .txt всегда будут одинаковыми, что, если вместо того, чтобы искать его, я просто пишу имя в код? Тогда мне не пришлось бы ждать события, потому что функция всегда начиналась сразу же. К сожалению, все попытки трансформировать эту функцию не удались, я только начал с js:/ – Jessica

+0

Браузеры будут препятствовать прямому чтению txt-файла в локальной файловой системе вашего посетителя. Посетитель должен инициировать ввод файла. См. Мой отредактированный ответ для получения дополнительной информации. – ghybs

Смежные вопросы