IE 10: SCRIPT5: ошибка доступа запрещена при событии щелчка якоря
Я пытаюсь сохранить SVG с холста как файл PNG, используя JavaScript. Код ниже, кажется, работает нормально на Chrome и Firefox, но в IE 10 я получаю ошибку ниже в моей консоли.
СЦЕНАРИЙ5: доступ запрещен.
Найдите ниже код, который я использовал:
var image = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream");
var a = $('<a>').attr("href", canvas.toDataURL("image/png")).attr("download", title + "png").appendTo($('#VisitsContainer'));
a[0].click();
a.remove();
Консоль указывает на событие click, которое я пытаюсь вызвать.
2 ответа
download
атрибут не реализован в Internet Explorer.
Для Internet Explorer вы можете использовать команду "Сохранить как".
Примечание о безопасности:
Браузеры обслуживают 2 мастера.
Браузеры должны обслуживать запрос пользователя на сохранение контента на свой локальный диск.
Браузеры также должны запретить потенциально вредоносному коду автоматически загружать биты на локальный диск пользователя.
Чтобы согласовать 2 задачи, браузеры используют подход, согласно которому пользователи могут загружать контент на свой локальный диск после некоторого процесса подтверждения (например, кнопки "Сохранить").
С помощью a[0].click();
Подтверждение для пользователя работает вопреки попытке браузера обеспечить безопасность.
FileSave.js - это кросс-браузерная библиотека, которая сохранит ваш холст на локальном диске пользователя. Это соответствует проблемам безопасности, требуя от пользователя нажатия кнопки для подтверждения загрузки.
Necromancing.
В IE вам не нужно создавать ссылку.
Достаточно создать новый Blob.
function saveMe(data, fileName)
{
var json = JSON.stringify(data),
blob = new Blob([json], { type: "octet/stream" }),
url = window.URL.createObjectURL(blob);
if (navigator.msSaveOrOpenBlob)
{
navigator.msSaveOrOpenBlob(blob, fileName);
return;
}
else if (window.navigator.msSaveBlob)
{ // for IE browser
window.navigator.msSaveBlob(blob, fileName);
return;
}
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
a.href = url;
a.download = fileName;
a.click();
window.URL.revokeObjectURL(url);
}
var data = { x: 42, s: "hello, world", d: new Date() }, fileName = "my-download.json";
// saveData(data, fileName);
saveMe(data, fileName);