Можно ли сохранить переменную JavaScript как файл?

Есть ли способ сохранить переменную JavaScript в файл (например, TXT, XML...), которую можно загрузить из браузера на ПК?

Спасибо за любой совет.

Ответы

Ответ 1

Да, вы можете сделать что-то подобное в HTML5, используя атрибут download

var textToSave = 'this is a test';

var hiddenElement = document.createElement('a');

hiddenElement.href = 'data:attachment/text,' + encodeURI(textToSave);
hiddenElement.target = '_blank';
hiddenElement.download = 'myFile.txt';
hiddenElement.click();

FIDDLE

Ответ 2

Вы можете использовать данные: URI, как в ответе adeneo, но другим способом является использование HTML5 Blob и createObjectURL (аналогично с помощью загрузки атрибут для создания ссылки для загрузки).

Преимущество использования createObjectURL в том, что в большинстве браузеров существуют серьезные ограничения по размеру URI данных.

Пример кода, взятого из связанной статьи:

var typedArray = GetTheTypedArraySomehow();
var blob = new Blob([typedArray], {type: 'application/octet-binary'});
    // pass a useful mime type here
var url = URL.createObjectURL(blob);
// url will be something like: blob:d3958f5c-0777-0845-9dcf-2cb28783acaf
// now you can use the url in any context that regular URLs can be used
// in, for example img.src, etc.

Ответ 3

Чтобы сохранить переменную javascript, я предлагаю вам использовать библиотеки хранения данных, подобные этому. где вы можете установить переменную, получить ее, удалить ее...

$.setData("key","value");
$.getData("key");
$.removeData("key");

но чтобы сохранить его в файле и сделать загружаемым, вам нужно передать сервер, если вы не используете трюк javascript для загрузки файла, который не существует, вы просто объявляете эти функции

 var Download = 
    {
        click : function(node) {
            var ev = document.createEvent("MouseEvents");
            ev.initMouseEvent("click", true, false, self, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
            return node.dispatchEvent(ev);
        },
        encode : function(data) {
                return 'data:application/octet-stream;base64,' + btoa( data );
        },
        link : function(data, name){
            var a = document.createElement('a');
            a.download = name || self.location.pathname.slice(self.location.pathname.lastIndexOf('/')+1);
            a.href = data || self.location.href;
            return a;
        }
    };
    Download.save = function(data, name)
    {
        this.click(
            this.link(
                this.encode( data ),
                name
            )
        );
    };

и когда вы хотите загрузить файл, вы делаете это

Download.save("data to be on a file","FileName.txt");

Наконец, вам нужно объединить хранилище данных и решение filedownload, чтобы получить результат, который вы запрашиваете