Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.08.2013, 17:44
Аспирант
Отправить личное сообщение для Esigns Посмотреть профиль Найти все сообщения от Esigns
 
Регистрация: 27.09.2012
Сообщений: 62

canvas добавление картинок
Всем привет.
Объясняю суть проблемы:
В канвас отображается несколько картинок, некоторые из них могут быть удалены, т.е нужно перерисовывать содержимое канвы.
Делаю это так:
// body это картинка - фон 
var body = new Image(), canvas = this.html.canvas, w = canvas.width, h = canvas.height, self = this;
var scr = canvas.getContext('2d');

body.onload = function() {
      //удаляю все с канвы и рисую по новой фон
      scr.clearRect(0, 0, canvas.width, canvas.height);
      scr.drawImage(body, 0, 0, canvas.width, canvas.height); 

      // self.addedAttr - обьект в котором находятся другие обьекты с данными о картинке. Где ее рисовать, ее размер, название и тд. Когда удаляю картинку с канвы удаляю ее из addedAttr и перерисовываю канвас
     for(var key in self.addedAttr) {
          var img = new Image();
          var w = self.addedAttr[key].width; // ширина картинки
          var h =  self.addedAttr[key].height; // высота
          var y = self.addedAttr[key].top, x = self.addedAttr[key].left; // х и у координаты
          img.onload = function() {
               scr.drawImage(img, x, y, w, h);
          }
          img.src = "/images/redactor/attrs/" + self.addedAttr[key].img;
     }
};
body.src = "/images/redactor/bodys/" + this.data.image;


В результате у меня рисуется только 1 картинка на фоне, вместо нескольких.
В чем может быть проблема? Спасибо.

Последний раз редактировалось Esigns, 12.08.2013 в 17:57.
Ответить с цитированием
  #2 (permalink)  
Старый 12.08.2013, 19:01
Профессор
Отправить личное сообщение для mta88 Посмотреть профиль Найти все сообщения от mta88
 
Регистрация: 16.05.2013
Сообщений: 229

похоже на ошибку с областью видимости переменной
попробуйте запихать тело цикла в замыкание
(function(key) {
    var img = new Image();
    var w = self.addedAttr[key].width;
    var h =  self.addedAttr[key].height;
    var y = self.addedAttr[key].top, x = self.addedAttr[key].left; 
    img.onload = function() {
        scr.drawImage(img, x, y, w, h);
    }
    img.src = "/images/redactor/attrs/" + self.addedAttr[key].img;
})(key);


еще насколько я помню, конструкция "img.onload" сама по себе проблемна
например не срабатывает если изображение уже есть в кешэ
Ответить с цитированием
  #3 (permalink)  
Старый 13.08.2013, 11:20
Аспирант
Отправить личное сообщение для Esigns Посмотреть профиль Найти все сообщения от Esigns
 
Регистрация: 27.09.2012
Сообщений: 62

Спасибо за советы. Я слабовато знаю жс и часто сталкиваюсь с граблями. Посмотрю что можно сделать.
------------------
Проблема была в том что идет загрузка в цикле и когда сработает событие onload цикл уже отработал. Т.е для всех картинок код
self.addedAttr[key] вернет одинаковое значение. Выходит, что я просто добавляю n-раз одно изображение.
Решил это дело записью в свойства картинки всех данных и обращением к ней, например event.target.width .
---------------------------------------
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление текста canvas IVAAAAN Общие вопросы Javascript 6 12.07.2013 15:00
Javascript добавление картинок по порядку v.v.dankiv Общие вопросы Javascript 1 29.03.2013 22:21
отрисовка большого кол-ва картинок на canvas cyber Events/DOM/Window 18 05.11.2012 00:24
Создание экземпляра Canvas не затрагивая HTML Tails Общие вопросы Javascript 2 09.03.2012 13:55
Добавить на canvas еще один елемент greengarlic Общие вопросы Javascript 5 22.09.2010 10:16