Как создать файл в памяти для загрузки пользователем, но не через сервер?

Регулярное выражение подходит для соответствия общему формату, но я думаю, вам нужно перевести синтаксический анализ на класс Date, например :

function parseDate(str) {
  var m = str.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/);
  return (m) ? new Date(m[3], m[2]-1, m[1]) : null;
}

Теперь вы можете использовать эту функцию для проверки допустимых дат; однако, если вам необходимо выполнить проверку подлинности без катания (например, «31/2/2010» автоматически не перевернется к «3/3/2010»), то у вас есть еще одна проблема.

[Изменить ] Если вы также хотите выполнить проверку без катания, вы можете добавить проверку для сравнения с исходной строкой, чтобы убедиться, что она равна той же дате:

function parseDate(str) {
  var m = str.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/)
    , d = (m) ? new Date(m[3], m[2]-1, m[1]) : null
    , nonRolling = (d&&(str==[d.getDate(),d.getMonth()+1,d.getFullYear()].join('/')));
  return (nonRolling) ? d : null;
}

[Edit2] Если вы хотите совпадение с нулем (например, «08/08/2013»), вы могли бы сделать что-то вроде этого:

function parseDate(str) {
  function pad(x){return (((''+x).length==2) ? '' : '0') + x; }
  var m = str.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/)
    , d = (m) ? new Date(m[3], m[2]-1, m[1]) : null
    , matchesPadded = (d&&(str==[pad(d.getDate()),pad(d.getMonth()+1),d.getFullYear()].join('/')))
    , matchesNonPadded = (d&&(str==[d.getDate(),d.getMonth()+1,d.getFullYear()].join('/')));
  return (matchesPadded || matchesNonPadded) ? d : null;
}

Однако он будет терпеть неудачу для непостоянно заполненных дат (например, «8/08/2013») ).

743
задан Matko 30 April 2019 в 08:00
поделиться

2 ответа

Мы можем использовать URL api, в особенности URL.createObjectURL () , и Блоб API, чтобы закодировать и загрузить в значительной степени что-либо.

document.body.innerHTML += 
`<a id="download" download="PATTERN.json" href="${URL.createObjectURL(new Blob([JSON.stringify("HELLO WORLD", null, 2)]))}"> Click me</a>`
download.click()
download.outerHTML = ""

Премия! Загрузка любой циклические объекты , избегайте ошибок:

TypeError: циклическое объектное значение (Firefox) TypeError: Преобразование

круговая структура к JSON (Chrome и Opera) TypeError: Проспект

ссылка в аргументе значения, не поддерживаемом (Край)

Используя https://github.com/douglascrockford/JSON-js/blob/master/cycle.js

/* JSON.decycle */
if(typeof JSON.decycle!=="function"){JSON.decycle=function decycle(object,replacer){"use strict";var objects=new WeakMap();return(function derez(value,path){var old_path;var nu;if(replacer!==undefined){value=replacer(value)}
if(typeof value==="object"&&value!==null&&!(value instanceof Boolean)&&!(value instanceof Date)&&!(value instanceof Number)&&!(value instanceof RegExp)&&!(value instanceof String)){old_path=objects.get(value);if(old_path!==undefined){return{$ref:old_path}}
objects.set(value,path);if(Array.isArray(value)){nu=[];value.forEach(function(element,i){nu[i]=derez(element,path+"["+i+"]")})}else{nu={};Object.keys(value).forEach(function(name){nu[name]=derez(value[name],path+"["+JSON.stringify(name)+"]")})}
return nu}
return value}(object,"$"))}}


document.body.innerHTML += 
`<a id="download" download="PATTERN.json" href="${URL.createObjectURL(new Blob([JSON.stringify(JSON.decycle(document), null, 2)]))}"></a>`
download.click()
1
ответ дан 22 November 2019 в 21:24
поделиться

Я использовал бы <a></a>, тег затем установил href='path'. Впоследствии, поместите изображение, промежуточное <a> элементы так, чтобы у меня могло быть визуальное для наблюдения его. Если бы Вы хотели, то Вы могли бы создать функцию, которая изменится href так, чтобы это только было той же ссылкой, но было динамично.

Дают эти <a>, отмечают id также, если Вы хотите получить доступ к нему с JavaScript.

Запуск с Версии HTML:

<a href="mp3/tupac_shakur-how-do-you-want-it.mp3" download id="mp3Anchor">
     <img src="some image that you want" alt="some description" width="100px" height="100px" />
</a>

Теперь с JavaScript:

*Create a small json file*;

const array = [
     "mp3/tupac_shakur-how-do-you-want-it.mp3",
     "mp3/spice_one-born-to-die.mp3",
     "mp3/captain_planet_theme_song.mp3",
     "mp3/tenchu-intro.mp3",
     "mp3/resident_evil_nemesis-intro-theme.mp3"
];

//load this function on window
window.addEventListener("load", downloadList);

//now create a function that will change the content of the href with every click
function downloadList() {
     var changeHref=document.getElementById("mp3Anchor");

     var j = -1;

     changeHref.addEventListener("click", ()=> {

           if(j < array.length-1) {
               j +=1;
               changeHref.href=""+array[j];
          }
           else {
               alert("No more content to download");
          }
}
0
ответ дан 22 November 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: