Чтение текстового файла

Zlodei1492

Добрый день! Необходимо прочитать локальный текстовый файл и передать его значение глобальной переменной. Присваивание содержимого файла переменной str в обработчике собыйтий reader.onload проходит нормально, но дальнейшее её использовании вне функции (например в функции rdfile) происходит так, будто присвоения содержимого файла не было. Подскажите как исправить!!! Код:
<!DOCTYPE html>
<html>
<head>
<script>
    var tfile;
    var reader = new FileReader();
    function rdfile(files)
    {   
        tfile = files[0];
        reader.readAsText(tfile);
    alert(str); 
    };
    reader.onload = function(e)
    {
        str=e.target.result;
    };
        
</script>
</head>
<body>
<div><input type="file" id="myfile" onchange="rdfile(this.files)"></div>
</body>
</html>
6 ответов

Zlodei1492

Zlodei1492, присвоение было, но дело в том, что оно выполнилось асинхронно (в обработчике), и было уже после вывода. Для того чтобы исправить Вашу проблему, необходимо поместить вывод переменной в асинхронный обработчик события onload (то есть как только файл подгружается — скрипт сразу же выводит его).
            var tfile;
            var reader = new FileReader();
            
            function rdfile(files)
            {
                tfile = files[0];
                reader.readAsText(tfile);
                reader.onload = function(e)
                {
                    str = e.target.result;
                    alert(str);
                };
            }


Zlodei1492

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


Zlodei1492

Да, спасибо! Но если мне необходимо будет работать с этой переменной, в которой находится содержимое файла, в других процедурах и функциях, то может получится такая же ситуация (процедура выполниться раньше чем прочитается файл) и переменная на данном этапе снова окажется пустой. Как решается проблема синхронизации???


Zlodei1492

Zlodei1492, я же сказал — работайте с содержимым только после того как файл загрузится (событие onload). По другому никак. И вообще, используйте в каждой функции свой загрузчик.


Zlodei1492

Благодарю! )Razip, если в текстовом файле находятся русские буквы, то при его чтении и дальнейшем выводе на экран русские буквы отображаются черными ромбами. Где настроить и как кодировку и возможно ли вообще это?


Zlodei1492

Zlodei1492, кодировку можно установить вторым аргументом у метода readAsText(). Таким образом:
reader.readAsText(tfile, 'CP1251');