Zapis pliku txt bez wyświetlania okna Zapisz Jako

0

Cześć. Próbuję zapisać plik txt za pomocą JavaScript i mam problem w wyskakującym oknem Zapisz Jako. Nie wiem jak zmienić kod, żeby go nie wyświetlać izapisywać plik w domyślnym miejscu. Dodatkowo potrzebuję do wspomnianego pliku przenieść wartość checkboxów - True/False, Tak/Nie, 0/1 - obojętne jak.
Mój kod wygląda tak:

<html>
<head>
    <HTA:APPLICATION ID="objHTAHelpomatic" APPLICATIONNAME="Checklist" SCROLL="no" SINGLEINSTANCE="yes" WINDOWSTATE="maximize" />
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <script src="js/FileSaver.js"></script> 
</head>
<script type="text/javascript" language="javascript">
    function saveBtn() {
    var blob = new Blob(["variables should be here"],
    {type: "text/plain;charset=utf-8"}
    );
    saveAs(blob, "myFile.txt");
    };
</script>

<body onload="window.resizeTo(610,670)">

    <input type="checkbox" name="checkbox01" value="1"> first<br>
    <input type="checkbox" name="checkbox02" value="1"> second<br>>
    <button onClick="saveBtn()">run!</button>

</body>
</html>

PLIK FileSaver.js

(function (global, factory) {
  if (typeof define === "function" && define.amd) {
    define([], factory);
  } else if (typeof exports !== "undefined") {
    factory();
  } else {
    var mod = {
      exports: {}
    };
    factory();
    global.FileSaver = mod.exports;
  }
})(this, function () {
  "use strict";
  var _global = typeof window === 'object' && window.window === window ? window : typeof self === 'object' && self.self === self ? self : typeof global === 'object' && global.global === global ? global : void 0;
  function bom(blob, opts) {
    if (typeof opts === 'undefined') opts = {
      autoBom: false
    };else if (typeof opts !== 'object') {
      console.warn('Deprecated: Expected third argument to be a object');
      opts = {
        autoBom: !opts
      };
    }
    if (opts.autoBom && /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
      return new Blob([String.fromCharCode(0xFEFF), blob], {
        type: blob.type
      });
    }
    return blob;
  }
  function download(url, name, opts) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url);
    xhr.responseType = 'blob';
    xhr.onload = function () {
      saveAs(xhr.response, name, opts);
    };
    xhr.onerror = function () {
      console.error('could not download file');
    };
    xhr.send();
  }
  function corsEnabled(url) {
    var xhr = new XMLHttpRequest(); // use sync to avoid popup blocker
    xhr.open('HEAD', url, false);
    try {
      xhr.send();
    } catch (e) {}
    return xhr.status >= 200 && xhr.status <= 299;
  } 
  function click(node) {
    try {
      node.dispatchEvent(new MouseEvent('click'));
    } catch (e) {
      var evt = document.createEvent('MouseEvents');
      evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null);
      node.dispatchEvent(evt);
    }
  }
  var saveAs = _global.saveAs || (
  typeof window !== 'object' || window !== _global ? function saveAs() {}
  : 'download' in HTMLAnchorElement.prototype ? function saveAs(blob, name, opts) {
    var URL = _global.URL || _global.webkitURL;
    var a = document.createElement('a');
    name = name || blob.name || 'download';
    a.download = name;
    a.rel = 'noopener'; 
    if (typeof blob === 'string') {
      a.href = blob;
      if (a.origin !== location.origin) {
        corsEnabled(a.href) ? download(blob, name, opts) : click(a, a.target = '_blank');
      } else {
        click(a);
      }
    } else {
      a.href = URL.createObjectURL(blob);
      setTimeout(function () {
        URL.revokeObjectURL(a.href);
      }, 4E4); // 40s
      setTimeout(function () {
        click(a);
      }, 0);
    }
  } 
  : 'msSaveOrOpenBlob' in navigator ? function saveAs(blob, name, opts) {
    name = name || blob.name || 'download';
    if (typeof blob === 'string') {
      if (corsEnabled(blob)) {
        download(blob, name, opts);
      } else {
        var a = document.createElement('a');
        a.href = blob;
        a.target = '_blank';
        setTimeout(function () {
          click(a);
        });
      }
    } else {
      navigator.msSaveOrOpenBlob(bom(blob, opts), name);
    }
  } // Fallback to using FileReader and a popup
  : function saveAs(blob, name, opts, popup) {
    // Open a popup immediately do go around popup blocker
    // Mostly only available on user interaction and the fileReader is async so...
    popup = popup || open('', '_blank');
    if (popup) {
      popup.document.title = popup.document.body.innerText = 'downloading...';
    }
    if (typeof blob === 'string') return download(blob, name, opts);
    var force = blob.type === 'application/octet-stream';
    var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari;
    var isChromeIOS = /CriOS\/[\d]+/.test(navigator.userAgent);
    if ((isChromeIOS || force && isSafari) && typeof FileReader === 'object') {
      var reader = new FileReader();
      reader.onloadend = function () {
        var url = reader.result;
        url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, 'data:attachment/file;');
        if (popup) popup.location.href = url;else location = url;
        popup = null; // reverse-tabnabbing #460
      };
      reader.readAsDataURL(blob);
    } else {
      var URL = _global.URL || _global.webkitURL;
      var url = URL.createObjectURL(blob);
      if (popup) popup.location = url;else location.href = url;
      popup = null; // reverse-tabnabbing #460
      setTimeout(function () {
        URL.revokeObjectURL(url);
      }, 4E4); // 40s
    }
  });
  _global.saveAs = saveAs.saveAs = saveAs;

  if (typeof module !== 'undefined') {
    module.exports = saveAs;
  }
});

Czy możecie mi pomóc z modyfikacją kodu?

3

Kiepsko to widzę - z tego co kojarzę, ze względów bezpieczeństwa jest to niemożliwe. Zastanów się - jakby każdy skrypt mógł sobie zapisywać na dysku dowolne rzeczy, to po pierwsze by był straszny bałagan, a po drugie w ten sposób mógłby zapisać na dysku jakieś niebezpieczne treści. Chociażby podmiana plików hosts by była zagrożeniem, aczkolwiek to pewnie ze względu na prawa dostępu do katalogów by było zablokowane. Ale wrzucenie na dysk (czy pulpit) jakiegoś pliku .bat, który potem użytkownik sobie odpali i w ten sposób zainfekuje swój system - to raczej niezbyt dobry pomysł. Zresztą kazdy komputer/system jest inaczej skonfigurowany, więc bez wskazania przez użytkownika lokalizacji, za bardzo nie widzę, jak to by miało działać. W przypadku aplikacji desktopowej masz chociażby katalog, z którego apka jest uruchamiana. A co by było takim katalogiem/folderem w przypadku skryptu JS?

Napisz co chcesz osiągnąć i po co Ci jest takie rozwiązanie, to może wymyślimy coś innego. W każdym razie - jeśli chcesz ten plik przekazać użytkownikowi, to raczej bez dialogu save as się nie obejdzie, a jeśli chcesz to zapisać na własne potrzeby to poszukaj informacji o haśle localStorage - https://developer.mozilla.org/pl/docs/Web/API/Window/localStorage

0

@cerrato, masz (niestety) całkowitą rację w sprawie bezpieczeństwa.
Faktycznie szerszy kontekst będzie bardziej czytelny:

Utworzyłem plik HTA z prostym formularzem - kilkanście checkboxów. Ten plik to tylko layout dla makra (xlsm) które w zależności od zaklikania checkboxów wykonuje różne operacje. Moim pierwszym strzałem było napisanie wszystkiego po stronie HTA w VBScript - i faktycznie wszystko ładnie działało, ale niestety przy wykorzystaniu CSS do wygładzenia layoutu, pojawiła się kolizja na linii CSS/VBScript. Mianowicie bez nagłówka

<meta http-equiv="x-ua-compatible" content="IE=edge">

CSS nie działał prawidłowo, a z tym nagłówkiem skrypty nie działają prawidłowo. Mocno się nad tym doktoryzowałem i jedyną opcją okazało się użycie JavaScript.
Teraz - nie potrafię przy pomocy JavaScript uruchomić makra, więc uruchamiam nim plik *.vbs, a z kolei ten plik odpala już makro.
Zapisanie pliku txt z wartościami checkboxów ma na celu przekazanie zmiennych do makra które sobie ten plik otworzy i sprawdzi co ma zrobić.
A może jest jakiś sposób, żeby JavaScript przekazał zmienne bezpośrednio?

1

Napiszę co zrozumiałem, żebyśmy mieli jasność :D
Twój skrypt działa ale bez CSS. Jak chcesz dodać CSS, to wtedy przestaje działać skrypt. Żeby obejść to, starasz się dołożyć coś w JS.
Na chwilę obecną są dostępne dwie opcje: działające, ale brzydko wyglądające, albo ładne (ale niesprawne). Dobrze to zrozumiałem?

0

Idealne streszczenie mojego wywodu :)

1

Taka porada - spróbuj w takim razie nie dodawać CSS, ale z poziomu JS dodać/modyfikować style elementów. Zrób na razie jakoś testowo dla jednej rzeczy i sprawdź, czy to będzie działać.

Tutaj masz przykład, jak z poziomu JS można zmieniać CSS wybranych elementów - https://jsfiddle.net/zaj45v80/ (jakbyś nie załapał - trzeba wcisnąć przycisk :P)

0

Ojej :) Pomysł w założeniu chyna niegłupi, ale moje style są MOCNO rozbudowane, z animacjami itd. Zerknę na to - może jakiś konverter znajdę.
A co do tego przekazywania zmiennych o których wspomniałem - istnieje taka opcja?

1
jaHolden napisał(a):

Zapisanie pliku txt z wartościami checkboxów ma na celu przekazanie zmiennych do makra które sobie ten plik otworzy i sprawdzi co ma zrobić.
A może jest jakiś sposób, żeby JavaScript przekazał zmienne bezpośrednio?

To może rozważ posłużenie się pseudoprotokołem, żeby wywołać program, który zapisze ci tego txt, albo może nawet spróbuj przekazać tą metodą paprametry prosto do makra, bez zapisywania niczego po drodze.
Zerknij na ten wątek:
Wysłanie sms ze strony przez MyPhoneExplorer

0

W zakresie drugiego pytania - nie wiem, może się da, ale ja tematu nie kojarzę.

Natomiast odnośnie skomplikowanych stylów - rzuć okiem na ten wątek - Skrypt, który wstawi kilka linków na stronę. a konkretnie to na mój post w nim zawarty. Pokazałem, jak można automatycznie pobrać/wstawić wiele wartości. Robiąc analogicznie, możesz sobie gdzieś zdefiniować (np. w osobnym pliku JS) w jakiejś tablicy wartości, a potem je z tego pliku pobrać i przy użyciu JS przypisać do wybranych elementów. Taka tabelka by mogła mieć mega prosta postać: ID elementu oraz wartość. A potem po prostu przelatujesz przez cała tabelę i po kolei przypisujesz każdą wartość do odpowiedniego elementu,

0

@Freja Draco, robi sie coraz ciekawiej :) Poczytam o tym.

A jeszcze jedna rzecz przyszła mi do głowy - może istnieje możliwość pobrania tych zmiennych przez wywołany VBS? Bo można przecież wywołać i setować np IE, wprowadzić odpowiedni URL i cobie coś tam ze strony pobrać. Ktoś spotkał się z setowaniem okna aplikacji HTA?

1 użytkowników online, w tym zalogowanych: 0, gości: 1