Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.06.2018, 07:53
Аватар для void()
Профессор
Отправить личное сообщение для void() Посмотреть профиль Найти все сообщения от void()
 
Регистрация: 11.08.2017
Сообщений: 208

Приятная загрузка ресурсов для canvas
В объекте "resource" перечисляются ресурсы для загрузки в формате: ДИРЕКТОРИЯ: [список файлов]. И сразу же можно вызывать ресурсы через точку - ДИРЕКТОРИЯ.имя_файла.
var resource = {
  IMG: ['man', 'woman'],
  BG: ['main', 'level']
};

И можно сразу пользоваться:
IMG.man

Скрипт:
function loadImg(resource) {
  for (key in resource) {
    window[key] = {};
    var dir = resource[key];
    for(var i = 0; i < dir.length; i++){
      window[key][dir[i]] = document.createElement('img');
      window[key][dir[i]].src = "images/" + key + '/' + dir[i] + ".png";
    }
  }
}

Еще из плюсов - возможность легко определить, когда загрузятся все ресурсы.
Ответить с цитированием
  #2 (permalink)  
Старый 06.06.2018, 10:10
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от void()
возможность легко определить, когда загрузятся все ресурсы.
А как определить? То что мы инициализировали источник, еще не значит что он загрузился.
Ответить с цитированием
  #3 (permalink)  
Старый 06.06.2018, 10:32
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Откопал старую тему, там я preload простенький реализовал, можно посмотреть.

Последний раз редактировалось Rise, 06.06.2018 в 10:34.
Ответить с цитированием
  #4 (permalink)  
Старый 06.06.2018, 10:38
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,719

На прошлой неделе писал класс, который работал с canvas.
Изображения так подгружал:
/**
 * @param {string} path
 * @return {Promise}
 */
AddressConstructor.prototype.loadImage=function(path){
	const That=this;

	return new Promise(function(resolve,reject){
		const ImageID='Constructor-image';
		let elem=document.getElementById(ImageID);
		if(!!elem)
			elem.parentNode.removeChild(elem);

		elem=document.createElement('img');
		elem.style.cssText='position:absolute;top:-9999px;left:-999999px;';
		elem.src=path;
		elem.addEventListener('load',function(){
			elem.parentNode.removeChild(elem);
			setTimeout(resolve,10,this);
		});
		elem.addEventListener('error',function(){
			elem.parentNode.removeChild(elem);
			reject(this);
		});

		document.body.appendChild(elem);
	}).then(function(image){
		That.__image=image;

		return image;
	});
};
Ответить с цитированием
  #5 (permalink)  
Старый 06.06.2018, 10:40
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Плюс MDN нам еще предлагает такую вещь делать:
// make sure the load event fires for cached images too
if ( img.complete || img.complete === undefined ) {
    img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
    img.src = src;
}

Последний раз редактировалось Rise, 06.06.2018 в 10:43.
Ответить с цитированием
  #6 (permalink)  
Старый 06.06.2018, 17:50
Аватар для void()
Профессор
Отправить личное сообщение для void() Посмотреть профиль Найти все сообщения от void()
 
Регистрация: 11.08.2017
Сообщений: 208

Прикольные варианты, спасибо.
Не знал про document.createDocumentFragment().
Rise, да, что-то торможу... Этот скрипт не дает никаких преимуществ в плане узнать, когда закончится загрузка. Надо делать как в вашем примере через onload или как у Nexus. Буду пробовать!

Преимущества только в простоте использования:
var resource = { IMG: ['man', 'woman'], BG: ['main', 'level'] };

Попробую допилить, сохранив эту простоту и будет огонь)
Ответить с цитированием
  #7 (permalink)  
Старый 06.06.2018, 18:28
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Nexus,
К чему эти кульбиты с appendChild/removeChild, вроде только <iframe> и <script> нуждаются в окружении, чтобы src начал работать, или нет?
Ответить с цитированием
  #8 (permalink)  
Старый 06.06.2018, 19:16
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,719

Rise, и правда.
Спасибо, не знал об этом.
Ответить с цитированием
  #9 (permalink)  
Старый 06.06.2018, 20:06
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Nexus,
Потестил ради интереса
audio   = document.createElement('audio'),  audio.src   = 'audioSrc';
embed   = document.createElement('embed'),  embed.src   = 'embedSrc';
iframe  = document.createElement('iframe'), iframe.src  = 'iframeSrc';
img     = document.createElement('img'),    img.src     = 'imgSrc';
input   = document.createElement('input'),  input.type  = 'image', input.src = 'inputSrc';
script  = document.createElement('script'), script.src  = 'scriptSrc';
source  = document.createElement('source'), source.src  = 'sourceSrc';
track   = document.createElement('track'),  track.src   = 'trackSrc';
video   = document.createElement('video'),  video.src   = 'videoSrc';

source1 = document.createElement('source'), source1.src = 'sourceSrc1';
track1  = document.createElement('track'),  track1.src  = 'trackSrc1';
video1  = document.createElement('video'), video1.appendChild(source1), video1.appendChild(track1);

// Network:
// - audioSrc, imgSrc, videoSrc, sourceSrc1 (Chrome, Opera, Yandex)
// - audioSrc, imgSrc, videoSrc, sourceSrc1, inputSrc, trackSrc1 (Firefox)
// - audioSrc, imgSrc, videoSrc, sourceSrc1, inputSrc, scriptSrc (IE)
Ответить с цитированием
  #10 (permalink)  
Старый 14.06.2018, 10:28
Аспирант
Отправить личное сообщение для Shadow Посмотреть профиль Найти все сообщения от Shadow
 
Регистрация: 05.06.2018
Сообщений: 36

Весьма неплохо
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
загрузка джаваскрипта file by file с номером ревизии(последней) в урле для файла sergdev Ваши сайты и скрипты 7 13.04.2010 10:52
Модуль для работы с модулями JSprog Ваши сайты и скрипты 29 02.09.2009 13:31
Аналог wmode=transparent для Canvas или svg lusever Events/DOM/Window 1 15.06.2009 16:05