Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Чтение и вывод данных из нескольких файлов (https://javascript.ru/forum/dom-window/74116-chtenie-i-vyvod-dannykh-iz-neskolkikh-fajjlov.html)

Nikc174 14.06.2018 16:13

Чтение и вывод данных из нескольких файлов
 
Здравствуйте!
Есть такая проблема, не получается прочитать и вывести данные из нескольких файлов (пробовал на 2, 3 и 4 файлах формата ".html").
При выборе файлов и запуске скрипта выводятся данные ТОЛЬКО из последнего выбранного файла. Причем выводятся столько раз, сколько выбрано файлов.
НО! если в определенное место вписать "alert()" (в приведенном коде указано куда), то все работает верно и выводятся все данные.

Написал такой код:
html:
<input type="file" id="file" multiple>
<button onclick="readFile(document.getElementById('file'))">Прочитать!</button>
		
<div id="text"> </div>


javascript:
function readFile(object) 
{
	//если вписать сюда alert(); то все работает верно, иначе выводит данные на каждом шаге цикла только из последнего файла
	var i;
	var file = object.files;
	var f;
	
	for (i = 0, f; f = file[i]; i++)
	{
		reader = new FileReader();
		reader.onload = function()
		{
			document.getElementById('text').innerHTML += reader.result;
			document.getElementById('text').innerHTML += "</br>";
		}
		
		reader.readAsText(f);
	}
}


javascript'ом занимаюсь недавно.
Вопрос:
1. как сделать верно вывод данных из файла, без "alert()"
2. как можно сделать открытие файлов без использования "input". Пробовал через массив, в котором находятся пути к файлам, не получилось.

j0hnik 14.06.2018 16:34

рекурсия
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
</head>
<body>
<input type="file" id="file" multiple>
<button onclick="readFile(document.getElementById('file'))">Прочитать!</button>		
<div id="text"> </div>

	<script type="text/javascript">

function readFile(object) 
{
	//если вписать сюда alert(); то все работает верно, иначе выводит данные на каждом шаге цикла только из последнего файла
	var i=0;
	var file = object.files;
	var f;
	
	(function fn(){
		f = file[i++];
		reader = new FileReader();
		reader.onload = function(){
			document.getElementById('text').innerHTML += reader.result;
			document.getElementById('text').innerHTML += "</br>";
			if(file[i]) fn();
		};	
		reader.readAsText(f);
	})();
}

</script>

	
</body>
</html>

j0hnik 14.06.2018 16:36

и вот это гляньте

https://javascript.ru/basic/closure#...-ispolzovaniya

Rise 14.06.2018 16:48

1. this.result
2. никак

Alexandroppolus 14.06.2018 16:49

Promise.all
Только чтение файла надо "промисифицировать"

Nikc174 15.06.2018 15:19

Благодарю! Помогло)
Можете еще пояснить, почему при добавлении "alert()" код работал верно?

j0hnik 15.06.2018 15:21

Nikc174,
alert задерживал выполнение и файл успевал прочитаться.

Nikc174 15.06.2018 15:24

j0hnik,
понятно. А кроме как через "input" файлы вообще никак нельзя открыть?

j0hnik 15.06.2018 15:54

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


Часовой пояс GMT +3, время: 14:38.