1

У меня есть небольшое web-приложение с использованием JS. Она лежит локально и должно точно так же использоваться локально. Без PHP и прочего.

В локальный файл (лежит в той же папке что и index.html) записываются данные. Сами данные - это всего лишь одно duble число (1 строка и все).

Как мне, в JS коде считать это число в переменную? ajax, jquery и не помогает. Мне надо чтобы я вывел эту переменную в alert(), а мне выводит либо [Object object] либо undefined. Перепробовал уже кучу способов из гугла - ничего не помогло.

UP:

url: file:///C:/Users/ROCKer/Desktop/test/index.html

var t;
 $.ajax({
    type:    "GET",
    url:     "1.txt",
    success: function(text) {
        t = text;
    },
    error:   function() {
        // An error occurred
    }
});
alert(t);
Grundy
  • 81,538
Wlad
  • 2,006
  • интерестно посмотреть как вы получаете данные из файла? код бы показали – Arsen Dec 21 '18 at 10:21
  • @Arsen так и говорю, что не могу получить. идей уже нуль просто. – Wlad Dec 21 '18 at 10:23
  • 1
    Из файла с браузера читать нельзя. Это ограничение безопасности. – Stepan Kasyanenko Dec 21 '18 at 10:24
  • покажи код, который выводил тебе либо [Object object] либо undefined – Grundy Dec 21 '18 at 13:17
  • а также, покажи что у тебя было в адресной строке. – Grundy Dec 21 '18 at 13:18
  • @Grundy написал – Wlad Dec 21 '18 at 13:28
  • @Wlad, в случае file:/// ajax не работает по умолчанию, и в консоли браузера можно увидеть ошибку об этом. Но даже если бы работал, то в таком коде alert(t) всегда выдавал бы undefined, потому что вызов alert происходит раньше чем вызов success обработчика. – Grundy Dec 21 '18 at 13:44
  • @Grundy и как быть? у меня в коде js есть функция, которая работает постоянно (не будем вдаваться в подробности). мне надо в нее передавать 1 параметр. этот параметр создается вообще из другого (кхм...) приложения. параметр постоянно обновляется. и функция в js тоже постоянно выполняется. оба файла лежат рядом. как можно заставить его постоянно считывать новые данные? – Wlad Dec 21 '18 at 13:50
  • @Wlad читайте про Electron, раз все локально запускается и будет локально, можно использовать его. Он умеет нативно в работу с файлами – ThisMan Dec 21 '18 at 14:08
  • Есть 2 варианта решения: 1. Воспользовать вместо браузера NodeJs или как выше сказанно Electron. 2. Если принципиально нужен браузер: нужно чтобы пользователь загружал этот фаил через форму input[file] после чего читать его. Если 2 вариант подходит, в ответе распишу подробнее. – Дмитрий Мирошниченко Dec 21 '18 at 14:23
  • 2
    @Wlad, если можно менять формат данных в файле, то можно загружать его как js код создавая элемент script, и передавая ему в src путь к файлу. В файле должен быть допустимый js код, например var a = 10, в этом случае после загрузки и выполнении скрипта можно будет обратиться к переменной a и получить значение 10 – Grundy Dec 21 '18 at 15:08
  • @Grundy да. то, что вы сказали - подошло. но этот файл перезаписывается. и необходимо каждый раз его заново считывать. как это можно реализовать? – Wlad Dec 21 '18 at 16:25
  • @Grundy спасибо за идею!! разобрался! позже выкину код для этого! ОГРОМНОЕ СПАСИБИЩЕ за это!! – Wlad Dec 21 '18 at 16:31

4 Answers4

2
    var t = '';
    // мне больше нравится так
    fetch('./foo.txt')
    .then(res => res.text())
    .then(data => {
        t = data;
        alert(t);
    })
    .catch(err => {
        throw err;
    });
    // но можно и так
    $.ajax({
        type: 'GET',
        url: './foo.txt',
        dataType: 'text',
        mimeType: 'application/text',
        success: function(text) {
            t = text;
            alert(t);
        },
        error: function(err) {
            throw err;
        }
    });
eustatos
  • 1,288
  • ajax не работает в случае file:/// – Grundy Dec 21 '18 at 15:08
  • 1
    @Grundy, не соглашусь. Работает. – eustatos Dec 21 '18 at 15:54
  • @eustatos и в какую же переменную записался файл? как мне вывести этот текст в alert например? – Wlad Dec 21 '18 at 16:21
  • @Wlad, внес изменения в код, чтобы выводился alert – eustatos Dec 21 '18 at 16:47
  • @eustatos, действительно, зависит от браузера. В хроме будет ошибка, в edge и ff вроде работает. – Grundy Dec 21 '18 at 17:45
1

Насколько я помню, JS не позволяет работать непосредственно с файлами в файловой системе, как другие ЯП (Java, C++, C#) поскольку твой код выполняет браузер и только он сможет достучаться до файлов (и то не факт) Есть документация И отличная статья с примерами Основная идея в том, что ты в своем index.html файле готовишь форму выбора и загрузки файла и уже посредством JS читаешь информацию из файла.

Есть другой способ получения информации, это запрос на сервер, который вернет тебе этот файл, но ты не хочешь использовать PHP и прочее :)

Надеюсь помог.

0

Как сказал @Grundy

если можно менять формат данных в файле, то можно загружать его как js код создавая элемент script, и передавая ему в src путь к файлу. В файле должен быть допустимый js код, например var a = 10, в этом случае после загрузки и выполнении скрипта можно будет обратиться к переменной a и получить значение 10

.........text.txt
var x = 10;
.................





....... основной js 


var fn; // переменная куда считаем наш файл 

// функция для чтения js внутри другого js 
function include(url) {
    var script = document.createElement('script');
    script.src = url;
    document.getElementsByTagName('head')[0].appendChild(script);
}

function xyz(){
    include("text.txt");   // подключим js и возьмем из него нашу переменную  
    return x;
}

function моя_функция_которая_постоянно_должна_считывать_новые_данные(){
    .......
    xyz()
    ..........
}
Wlad
  • 2,006
  • ну вообще это не должно работать, потому что appendChild Только добавляет script, ты не можешь знать когда он загрузиться. можно добавить обработчик onload для script, и в нем уже получать результат. Подробнее про получение результата из асинхронной функции можно посмотреть тут – Grundy Dec 22 '18 at 08:06
  • @Grundy может подскажите как удалить этот подключенный скрипт похожим способом? проблема в том, что он подключается и остается до перезагрузки страницы. и когда в нем данные обновились и я пытаюсь их считать - мне выдает уже неактуальную переменную (var x было 10 стало 20), а он мне все продолжает выдавать 10. – Wlad Dec 22 '18 at 12:15
  • достаточно просто еще раз вызвать загрузку - скрипт еще раз загрузится и значение переменной обновится – Grundy Dec 22 '18 at 12:44
  • @Grundy так я так и делаю. но оно не обновляется. может знаете что мешает этому в Android WebView (в браузере на компе все работает ИДЕАЛЬНО). – Wlad Dec 22 '18 at 12:51
  • Нужно отлаживать, так как это обычный скрипт можешь добавить в него console.log и посмотреть выполняется он вообще второй раз или нет. – Grundy Dec 22 '18 at 12:53
  • @Grundy я писал там мат.функцию для рандомных чисел - все работало. конкретный затык получается именно сейчас, когда пытаюсь еще раз получать информацию оттуда. – Wlad Dec 22 '18 at 13:00
0

А если сохранять данные в формате json и потом парсить их:

var url = "file.json";
var xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.send();

xhr.onreadystatechange = function(){
    if (xhr.readyState == 4) {
        if (xhr.status == 200) {
            var result = JSON.parse(xhr.responseText);
        }
    }
}