установите Blob как "src" iframe

следующий код отлично работает в Chrome

<script>
function myFunction() {
var blob = new Blob(['<a id="a"><b id="b">hey!</b></a>'], {type : 'text/html'});
var newurl = window.URL.createObjectURL(blob);
    document.getElementById("myFrame").src = newurl;
}
</script>

но он не работает с IE. Кто-нибудь может сказать мне, что здесь не так?

iframe " src " также установлен в blob, как показано ниже.

<iframe id="myFrame" src="blob:0827B944-D600-410D-8356-96E71F316FE4"></iframe>

Примечание.: Я пошел на window.navigator.msSaveOrOpenBlob(newBlob) путь, но пока не повезло.

3 ответов


согласно http://caniuse.com/#feat=datauri IE 11 имеет только частичную поддержку URI данных. В нем говорится, что поддержка ограничена изображениями и связанными ресурсами, такими как CSS или JS, а не HTML-файлами.

Не-base64-закодированные SVG данные URI должны быть uriencoded для работы в IE и Firefox, как в соответствии с этой спецификацией.


я столкнулся с той же проблемой с IE. Тем не менее, я смог получить загрузку/сохранение как часть, работающую в IE 10+, используя filesaver.js.

function onClick(e) {
    var data = { x: 42, s: "hello, world", d: new Date() },
    fileName = "my-download.json";
    var json = JSON.stringify(data),
        blob = new Blob([json], {type: "octet/stream"});

   saveAs(blob, fileName);      

   e.preventDefault();
   return false;
};

$('#download').click(onClick);

см.http://jsfiddle.net/o0wk71n2/ (на основе ответа @kol на имя файла blob JavaScript без ссылки)


пример, который я сделал для Blob как источник iFrame и отлично работает с одним важным ВНИМАНИЕ / ПРЕДУПРЕЖДЕНИЕ:

const blobContent = new Blob([getIFrameContent()], {type: "text/html"});
var iFrame = document.createElement("iframe");
iFrame.src = URL.createObjectURL(blobContent);
parent.appendChild(iFrame);

iFrame с Blob не является протоколом автоматического перенаправления, то есть, имея <script src="//domain.com/script.js"</script> внутри iframe head или body не будет загружать скрипт JS вообще даже на Chrome 61 (текущая версия).

он не знает, что делать с исходным "blob" в качестве протокола. это серьезное предупреждение.

устранение: этот код решит проблему, работает в основном для VPAID объявлений и работает для авто-протокола:

function createIFrame(iframeContent) {
    let iFrame = document.createElement("iframe");
    iFrame.src = "about:blank";
    iFrameContainer.innerHTML = ""; // (optional) Totally Clear it if needed
    iFrameContainer.appendChild(iFrame);

    let iFrameDoc = iFrame.contentWindow && iFrame.contentWindow.document;
    if (!iFrameDoc) {
    console.log("iFrame security.");
    return;
    }
    iFrameDoc.write(iframeContent);
    iFrameDoc.close();
}