Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.07.2015, 23:22
Интересующийся
Отправить личное сообщение для 0leg9 Посмотреть профиль Найти все сообщения от 0leg9
 
Регистрация: 10.06.2013
Сообщений: 12

Canvas Вывод изображений в цикле
Пытаюсь вывести изображения на холст через цикл. Появляется только последняя картинка. В массиве data содержатся объекты со свойствами: путь к картинке, координаты x и y.
var canvas  = document.getElementById('canvas');
context = canvas.getContext('2d');
var obj;
for (var i = 0; i < data.length; i++) {
   obj = data[i];
   var image = new Image();
   image.src = obj.path;
   image.onload = function() {
      context.drawImage(image, obj.x, obj.y);
   };
};
Ответить с цитированием
  #2 (permalink)  
Старый 14.07.2015, 00:19
Интересующийся
Отправить личное сообщение для 0leg9 Посмотреть профиль Найти все сообщения от 0leg9
 
Регистрация: 10.06.2013
Сообщений: 12

В моем случае работает такой код:
var canvas  = document.getElementById('canvas');
context = canvas.getContext('2d');
var obj;
for (var i = 0; i < data.length; i++) {
   obj = data[i];
   draw(obj.path, obj.x, obj.y);
};
function draw (path, x, y) {
   var image = new Image();
   image.src = path;
   image.onload = function() {
      context.drawImage(image, x, y);
   };
};
Ответить с цитированием
  #3 (permalink)  
Старый 14.07.2015, 00:31
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

0leg9,
описание вашей проблемы
Ответить с цитированием
  #4 (permalink)  
Старый 14.07.2015, 00:54
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

0leg9, может так у вас должно быть?

var data = ['http://placehold.it/50x50', 'http://placehold.it/100x100'];
var obj = {};

for (var i = 0; i < data.length; i++) {
    obj[i] = data[i];
}

console.log(obj);
Ответить с цитированием
  #5 (permalink)  
Старый 14.07.2015, 01:29
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Decode,
как у него должно он уже решил через замыкание данных строка 6 пост 2
Ответить с цитированием
  #6 (permalink)  
Старый 14.07.2015, 01:36
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

рони, ааа, все понял. Я чет не обратил внимание на второй пост.
Ответить с цитированием
  #7 (permalink)  
Старый 14.07.2015, 06:15
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от 0leg9
Появляется только последняя картинка
Когда ваш цикл мгновенно накидал в память отложенных операций, то аргументом obj каждой операции оказался один и то же объект из массива - самый последний. Потому что внутри цикла оно все - референс, ссылка.

Что там дал рони почитать - то будет понятно только тем, кто и так понимает.

Понимать надо разницу между передачей значения переменной по ссылке на переменную - by reference, и копии значения переменной - by value.

Например значения аргументов функции всегда копируются, если не указано иначе. Например в нормальном скрипте типа php:

Каноничная передача by val:

function foo($bar){ $bar.=' jump'; echo $bar;};


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

$text='How to';

bar($text); // выведет How to jump

echo $text // вывод How to



А вот если передавать по ссылке

function foo(&$bar){ echo $bar;};


то

$text='How to';

bar($text); // выведет How to jump

echo $text // вывод How to jump


то функция "испортит" значение, поменяет его, запишет свое и в таком роде.

На жабе таких примеров не могу привести, она явно не дает определять режим.

Но ясно что внутри цикла все его аргументы крутятся by ref и все нормально работает если копируется в каждой итерации куда-то сразу же, не отходя от кассы (например в хтмл или в консоль). А если не копируется, а откладывается на будущее - то в будущем оказывается копия одного и то же значения у всех отложенных операций. Следовательно все что вам нужно это вручную скопировать текущее значение для будущего применения.

Последний раз редактировалось kostyanet, 14.07.2015 в 06:18.
Ответить с цитированием
  #8 (permalink)  
Старый 14.07.2015, 07:27
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от рони
через замыкание данных строка 6 пост 2
Забавно. С каких это пор вызов функции сам по себе стал замыканием?

Короче, замыкание у него и так было, просто внутрь ничего не попадало. Это image.onload.

Цикл вряд ли тут вообще нужен, ибо порядок определяет не цикл, а скорость загрузки фоток. Чтобы все было четко по порядку, надо завести загрузку следующей в тот же самый обработчик.

Самый простой пример

var drawPath=function(){
	var canvas  = document.getElementById('canvas'),
	context = canvas.getContext('2d'),
	i=0,
	drawImage=function(){
		var obj=data[i++];
		if(obj){
			var image = new Image();
			image.onload=function(){
				context.drawImage(this, obj.x, obj.y);
				drawImage();
			};
			image.src=obj.path;
		}
	};
	drawImage();
};

drawPath();



для проверки

http://jsfiddle.net/z9nk1238/3/

ЗЫ Я сначала подумал что ТС рисует сегменты пути, потом только допер что - обычные фотки.
Ответить с цитированием
  #9 (permalink)  
Старый 14.07.2015, 08:15
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от kostyanet
то функция "испортит" значение
Да уж, определенице ничего не скажешь.
Ответить с цитированием
  #10 (permalink)  
Старый 14.07.2015, 08:30
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Когда нечего сказать - молчат.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Canvas, проблемы с отрисовкой изображений sunAirway Общие вопросы Javascript 4 07.01.2016 22:21
Вывод изображений из папок Dark_Delphin Серверные языки и технологии 9 23.07.2014 14:54
вывод изображений, вместо прописывание img Alina25 Элементы интерфейса 1 01.04.2013 21:25
Вывод данных из базы в цикле со ссылкой на всплывающее окно alexvb Events/DOM/Window 14 10.02.2012 16:16
Автоматический вывод всех изображений Stalker Общие вопросы Javascript 5 10.07.2009 13:27