Это легко исправить, но сначала я хочу кое-что вам объяснить.
Что такое URL-адреса BLOB-объектов или URL-адреса объектов? Blob URL / Object URL - это псевдопротокол, позволяющий использовать объекты Blob и File в качестве источника URL для таких вещей, как изображения, ссылки для загрузки двоичных данных и т. Д.
В вашем случае, если вы попытаетесь открыть этот URL-адрес BLOB-объекта src="blob:https://yada.yada"
, являющийся источником загруженного изображения, он выдаст вам ошибку и его не удастся открыть.
Да, я знаю, что Teo, но почему, если это работает с тегом src, как это возможно?
Ну, URL-адреса BLOB-объектов могутгенерироваться только внутри браузера.Таким образом, эти элементы имеют специальную ссылку на объект Blob или File.Эти URL-адреса могут использоваться только локально в одном экземпляре браузера и в одном и том же сеансе (т. Е. В жизни страницы / документа).
Так что в этом случае src="blob:https://yada.yada"
связан с img
тег, созданный объектом LoadQueue
.
Тогда, как я могу использовать одно и то же изображение в нескольких элементах?
В документации LoadQueue , которую мы можем получить Объект BLOB с использованием метода getResult()
.Таким образом, вместо повторного использования BLOB-URL мы можем "клонировать" объект BLOB-объекта .Согласно документации методы getResult (value, [rawResult=false])
были перезаписаны для получения этого необязательного параметра rawResult
.Если этот параметр равен true
, метод возвращает необработанный результат в виде объекта BLOB-объекта вместо отформатированного результата.Если нет необработанного результата, вместо него будет возвращен отформатированный результат.
ОК, но как я могу использовать этот BLOB-объект в элементе <img>
?
Что ж, мы можем использовать URL.createObjectURL()
метод.Этот метод создает строку DOMString, содержащую новый URL-адрес BLOB-объекта , представляющий объект BLOB-объекта , указанный в параметре.
AsЯ объяснил выше, этот URL-адрес BLOB-объекта время жизни привязан к документу в окне, в котором он был создан.
Вот реализация:
let queue = new createjs.LoadQueue();
queue.addEventListener('complete', onComplete);
queue.loadManifest([{
id: 'sprite',
type: 'image',
src: 'https://i.imgur.com/ciIyRtu.jpg?1',
}, ]);
queue.load();
function onComplete(event) {
// Get Blob object instead of a formatted result
let blob = queue.getResult('sprite', true);
// Create a Blob URL using the Blob object
let urls = [
URL.createObjectURL(blob),
URL.createObjectURL(blob),
URL.createObjectURL(blob),
];
// Create a new <img> element and assign a Blob URL
urls.forEach(function(item, index, array) {
let DOM_img = document.createElement('img');
DOM_img.src = item;
document.getElementById('game').appendChild(DOM_img);
});
}
<script src="https://code.createjs.com/1.0.0/preloadjs.min.js"></script>
<div id="game"></div>
Альтернативное решение (не рекомендуется для больших файлов)
Также вы можете использовать loadManifest()
для загрузки одного и того же изображения несколько раз с разнымиидентификаторы.Затем мы определяем событие fileload
вместо события complete
для захвата каждого загруженного элемента, проверьте этот пример:
let queue = new createjs.LoadQueue();
queue.addEventListener('fileload', onFileLoad);
queue.loadManifest([{
id: 'sprite1',
type: 'image',
src: 'https://i.imgur.com/ciIyRtu.jpg?1',
}, {
id: 'sprite2',
type: 'image',
src: 'https://i.imgur.com/ciIyRtu.jpg?1',
}, {
id: 'sprite3',
type: 'image',
src: 'https://i.imgur.com/ciIyRtu.jpg?1',
}, ]);
function onFileLoad(event) {
// Get the image element after is successfully loaded
let img = event.result;
// This code insert the image to the DOM succesfully
document.getElementById('game').appendChild(img);
}
<script src="https://code.createjs.com/1.0.0/preloadjs.min.js"></script>
<div id="game"></div>