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.

http://caniuse.com/download

Для Internet Explorer вы можете использовать команду "Сохранить как".

Примечание о безопасности:

Браузеры обслуживают 2 мастера.

Браузеры должны обслуживать запрос пользователя на сохранение контента на свой локальный диск.

Браузеры также должны запретить потенциально вредоносному коду автоматически загружать биты на локальный диск пользователя.

Чтобы согласовать 2 задачи, браузеры используют подход, согласно которому пользователи могут загружать контент на свой локальный диск после некоторого процесса подтверждения (например, кнопки "Сохранить").

С помощью a[0].click(); Подтверждение для пользователя работает вопреки попытке браузера обеспечить безопасность.

FileSave.js - это кросс-браузерная библиотека, которая сохранит ваш холст на локальном диске пользователя. Это соответствует проблемам безопасности, требуя от пользователя нажатия кнопки для подтверждения загрузки.

https://github.com/eligrey/FileSaver.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);
Другие вопросы по тегам