Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.02.2013, 11:36
Интересующийся
Отправить личное сообщение для egreek Посмотреть профиль Найти все сообщения от egreek
 
Регистрация: 22.08.2011
Сообщений: 18

HTML5 Canvas не перерисовывает
Здравствуйте, сложилась следующая ситуация при использовании HTML5 Canvas.

Есть страничка с превьюшками рубашек и галстуков.
При клике на превью галстука, он рисуется на канве.
<img onclick="drawTieImg('tie1.png');" ... />

При клике превью рубашки должна рисоваться рубашка и галстук, который до этого был нарисован, чтобы рубашке не перетирала его.
<img onclick="drawShirtImg('blouse1.png'); drawTieImg(lastTie);" ... />

На деле рисуется только рубашка. Но при втором клике по превью текущей рубашки, галстук прорисовывается нормально. Пробежавшись по всем рубашкам, впоследствии галстук тоже рисуется нормально.

Данная проблема наблюдается только на хостинге, на локальном сервере - все ок. Есть осознание того, что это связано с тем, что галстук не успевает подгрузиться, но непонятно на данный момент как решить проблему и почему событие onload не справляется с этим.

Функции рисования такие:

var lastTie = '';

function drawTieImg(imgname) {
    var img = new Image();
    lastTie = imgname;
    img.src = IMG_URL+imgname;
    img.onload = function(){
    	ctx.drawImage(img, 0, 125);
    }
}

function drawShirtImg(imgname) {

    var img = new Image();
    img.src = IMG_URL+imgname;
    img.onload = function(){
    	ctx.drawImage(img, 0, 125);
    }

}


Заранее благодарен!
Ответить с цитированием
  #2 (permalink)  
Старый 21.02.2013, 12:48
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Попробуйте загружать картинки с галстуками при наведении, или при загрузке страницы.
Ответить с цитированием
  #3 (permalink)  
Старый 21.02.2013, 13:04
Интересующийся
Отправить личное сообщение для egreek Посмотреть профиль Найти все сообщения от egreek
 
Регистрация: 22.08.2011
Сообщений: 18

А ведь, по идее, картинка с галстуком уже загружена, ведь должен перерисовываться тот галстук, который только что был выбран перед рубашкой.
Ответить с цитированием
  #4 (permalink)  
Старый 21.02.2013, 13:13
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Можно ссылку на сайт?
Ответить с цитированием
  #5 (permalink)  
Старый 21.02.2013, 13:26
Профессор
Отправить личное сообщение для zebra Посмотреть профиль Найти все сообщения от zebra
 
Регистрация: 14.09.2011
Сообщений: 523

img.src = IMG_URL+imgname;
img.onload = function()

Местами поменяйте. Картинка может грузится из кеша, тогда onload не сработает
Ответить с цитированием
  #6 (permalink)  
Старый 21.02.2013, 14:20
Интересующийся
Отправить личное сообщение для egreek Посмотреть профиль Найти все сообщения от egreek
 
Регистрация: 22.08.2011
Сообщений: 18

Сообщение от tsigel Посмотреть сообщение
Можно ссылку на сайт?
Да, конечно: http://man-classic.com/look1/ и на JS-файл - http://man-classic.com/look1/js/fitting.js

Убрал функцию галстука в рубашку.
Если сначала выбрать галстук, а потом рубашки переберать, то галстук
закрашивается при выборе первой, а при выборе второй появляется на мгновение перетерается снова.

Сообщение от zebra Посмотреть сообщение
Местами поменяйте. Картинка может грузится из кеша, тогда onload не сработает
Пробовал разными сочетаниями. Результат одинаковый.
Ответить с цитированием
  #7 (permalink)  
Старый 21.02.2013, 15:35
Профессор
Отправить личное сообщение для zebra Посмотреть профиль Найти все сообщения от zebra
 
Регистрация: 14.09.2011
Сообщений: 523

Как бы на глаз видно, что галстук затирается. Значит галстук должен рисоваться последним.
Ответить с цитированием
  #8 (permalink)  
Старый 21.02.2013, 15:40
Интересующийся
Отправить личное сообщение для egreek Посмотреть профиль Найти все сообщения от egreek
 
Регистрация: 22.08.2011
Сообщений: 18

Сообщение от zebra Посмотреть сообщение
Как бы на глаз видно, что галстук затирается. Значит галстук должен рисоваться последним.
Это логично. Но не очень понятно, почему не рисуется он последним при использовании такой конструкции.
function drawShirtImg(imgname) {

    var img = new Image();
	img.onload = function(){
    	ctx.drawImage(img, 0, 125);
    }
    img.src = IMG_URL+imgname;
	
    drawTieImg(lastTie);

}
Ответить с цитированием
  #9 (permalink)  
Старый 21.02.2013, 16:01
Профессор
Отправить личное сообщение для zebra Посмотреть профиль Найти все сообщения от zebra
 
Регистрация: 14.09.2011
Сообщений: 523

Потому что картинка отрисуется только после события onload, туда и подставьте drawTieImg
Ответить с цитированием
  #10 (permalink)  
Старый 21.02.2013, 16:28
Интересующийся
Отправить личное сообщение для egreek Посмотреть профиль Найти все сообщения от egreek
 
Регистрация: 22.08.2011
Сообщений: 18

Сообщение от zebra Посмотреть сообщение
Потому что картинка отрисуется только после события onload, туда и подставьте drawTieImg
Спасибо, zebra? вроде работает! <3

Интересно, есть какой-то более-менее безгеморойный метод избежать мерцания при первичной прорисовке, которое иногда появляется? Или нужно какой-то прелодер делать?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
HTML5 CANVAS slava878787 Оффтопик 20 23.06.2014 02:32
Html5 canvas эффект наведения Moonlight Оффтопик 16 29.01.2013 20:44
html5. Canvas Valdemor (X)HTML/CSS 2 25.08.2012 00:26
html5, Canvas, KineticJS, cvg, google chrome N3K Библиотеки/Тулкиты/Фреймворки 0 20.07.2012 12:43
Canvas html5 Иваннн Оффтопик 9 16.01.2012 00:41