Почему моя анимация HTML 5 <CANVAS>не отображается должным образом в Joomla, когда пользователи покидают главную страницу - PullRequest
1 голос
/ 14 февраля 2012

Я создаю прекрасную (!) Анимацию в своем шаблоне Joomla, используя Javascript и тег HTML5. На разных слоях расположены 7 прозрачных облаков, которые все перемещаются друг над другом при перемещении по странице.Название сайта также является частью, так что облака могут идти за ним или перед ним в зависимости от слоя, на котором они находятся.

Вы можете увидеть это там сами: http://www.flunki.com

Все работает на первой странице.Но как только вы нажимаете на ссылки (например, блог слева), анимация прекращается, и все, что у меня есть, - это одно статическое облако (иногда 2) в левой части экрана.Возвращение на главную страницу не решает эту проблему и не выполняет перезагрузку.Перезагрузка F5 устраняет проблему.

Для меня это как-то связано с кэшированием страницы где-то (Cache в Joomla выключен), но я не нашел, как решить проблему.

Может кто-нибудь помочь, пожалуйста?

Вот код, который является частью шаблона:

<script type="text/javascript">
var canvas;
var ctx;
var max;
var logopos; 
var background;
var logo;
var width = 1300;
var height = 150;
var cloud1;
var cloud1_x;
var cloud1_y;
var cloud2;
var cloud2_x;
var cloud2_y;
var cloud3;
var cloud3_x;
var cloud3_y;
var cloud4;
var cloud4_x;
var cloud4_y;
var cloud5;
var cloud5_x;
var cloud5_y;
var cloud6;
var cloud6_x;
var cloud6_y;
var cloud7;
var cloud7_x;
var cloud7_y;
var cloud8;
var cloud8_x;
var cloud8_y;
var irun;

function init() {
    canvas = document.getElementById("clouds");
    width = window.innerWidth;
irun =+ 1;
    height = canvas.height;
    ctx = canvas.getContext("2d");

    // init background 
    background = new Image();
    background.src = 'http://www.flunki.com/templates/celebs_plazza/images/backblue.png';

// init logo 
    logo = new Image();
    logo.src = 'http://www.flunki.com/templates/celebs_plazza/images/logo.png';


    // init cloud1
    cloud1 = new Image();
    cloud1.src = 'http://www.flunki.com/templates/celebs_plazza/images/cloud40.png';
    cloud1.onload = function(){
    cloud1_x = 60;
        cloud1_y = 5;
};

// init cloud3
    cloud3 = new Image();
    cloud3.src = 'http://www.flunki.com/templates/celebs_plazza/images/cloud50.png';
    cloud3.onload = function(){
    cloud3_x = max/2;
        cloud3_y = 60;
};
// init cloud5
    cloud5 = new Image();
    cloud5.src = 'http://www.flunki.com/templates/celebs_plazza/images/cloud60.png';
    cloud5.onload = function(){
    cloud5_x = max-180;
        cloud5_y = 35;
};
// init cloud7
    cloud7 = new Image();
    cloud7.src = 'http://www.flunki.com/templates/celebs_plazza/images/cloud70.png';
    cloud7.onload = function(){
    cloud7_x = 200;
        cloud7_y = 75;
};

// init cloud2
    cloud2 = new Image();
    cloud2.src = 'http://www.flunki.com/templates/celebs_plazza/images/cloud60.png';
    cloud2.onload = function(){
    cloud2_x = max-100;
        cloud2_y = 15;
};

// init cloud4
    cloud4 = new Image();
    cloud4.src = 'http://www.flunki.com/templates/celebs_plazza/images/cloud50.png';
    cloud4.onload = function(){
    cloud4_x = max-300;
        cloud4_y = -15;
};

// init cloud6
    cloud6 = new Image();
    cloud6.src = 'http://www.flunki.com/templates/celebs_plazza/images/cloud70.png';
    cloud6.onload = function(){
    cloud6_x = max-560;
        cloud6_y = 8;
};

// init cloud8
    cloud8 = new Image();
    cloud8.src = 'http://www.flunki.com/templates/celebs_plazza/images/cloud40.png';
    cloud8.onload = function(){
    cloud8_x = 0;
        cloud8_y = 38;
};

return setInterval(main_loop, 10);
}

function update(){
max = window.innerWidth;
logopos = (640 + ((window.innerWidth-960)/2));
cloud1_x -= .05;
if (cloud1_x < -128) {
cloud1_x = max;
}
cloud3_x -= .2;
if (cloud3_x < -128) {
cloud3_x = max;
}
cloud5_x -= .15;
if (cloud5_x < -128) {
cloud5_x = max;
}
cloud7_x -= .1;
if (cloud7_x < -128) {
cloud7_x = max;
}
cloud2_x += .1;
if (cloud2_x>max ) {
cloud2_x  = -128;
}
cloud4_x += .05;
if (cloud4_x>max ) {
cloud4_x  = -128;
}
cloud6_x += .15;
if (cloud6_x>max ) {
cloud6_x  = -128;
}
cloud8_x += .2;
if (cloud8_x>max ) {
cloud8_x  = -128;
}
}

function draw() {
ctx.canvas.width  = window.innerWidth-20;
ctx.drawImage(background,0,0);

ctx.drawImage(cloud1, cloud1_x, cloud1_y);
ctx.drawImage(cloud2, cloud2_x, cloud2_y);
ctx.drawImage(cloud3, cloud3_x, cloud3_y);
ctx.drawImage(cloud4, cloud4_x, cloud4_y);
ctx.drawImage(cloud5, cloud5_x, cloud5_y);
ctx.drawImage(cloud6, cloud6_x, cloud6_y);
ctx.drawImage(logo,logopos,0);
ctx.drawImage(cloud7, cloud7_x, cloud7_y);
// ctx.drawImage(cloud8, cloud8_x, cloud8_y);

}

function main_loop() {
    draw();
    update();
}

init();



</script>

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Хорошо, я выяснил, где проблема, в конце концов.

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

Это не помогло.

Затем я вернулся на сайт, который использовал, чтобы начать работу с анимацией, и использовал их код в моем модуле, и он работал длянекоторое время, а затем остановился.Я до сих пор не знаю, почему, но я заменяю код на простой холст-анимацию HTML5, и он работал где угодно на первой странице.Тогда это должен был быть мой код.

Я вернулся к нему и обнаружил, что перерисовывал логотип с помощью window.innerWidth каждый раз, когда изображение обновлялось (пока загружалась вся графика).Это сработало в первый раз, когда страница была загружена, но не в последующие разы, как указано rezoner , что заставило меня открыть для себя все тонкости DOMReady (спасибо вам за это).

Обновленный код ниже отражает это и работает как шарм.

<!doctype html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>flunkibanner</title>
  </head>
<body>
  <section>
    <div>
        <canvas id="clouds" width="100%" >
         Your browser does not fully support HTML5.<BR>
Maybe it is time to upgrade ?

        </canvas>

    </div>

<script type="text/javascript">
var canvas;
var ctx;
var max;
var logopos; 
var background;
var logo;
var width = 1300;
var height = 150;
var cloud1;
var cloud1_x;
var cloud1_y;
var cloud2;
var cloud2_x;
var cloud2_y;
var cloud3;
var cloud3_x;
var cloud3_y;
var cloud4;
var cloud4_x;
var cloud4_y;
var cloud5;
var cloud5_x;
var cloud5_y;
var cloud6;
var cloud6_x;
var cloud6_y;
var cloud7;
var cloud7_x;
var cloud7_y;
var cloud8;
var cloud8_x;
var cloud8_y;

function init() {
    canvas = document.getElementById("clouds");
    width = window.innerWidth;
    max = window.innerWidth;
    height = canvas.height;
    ctx = canvas.getContext("2d");
    ctx.canvas.width  = window.innerWidth-20;

    // init background 
    background = new Image();
    background.src = 'http://www.flunki.com/templates/celebs_plazza/images/backblue.png';

// init logo 
    logo = new Image();
    logo.src = 'http://www.flunki.com/templates/celebs_plazza/images/logo.png';
    logopos = (640 + ((window.innerWidth-960)/2));

    // init cloud1
    cloud1 = new Image();
    cloud1.src = 'http://www.flunki.com/templates/celebs_plazza/images/cloud40.png';
    cloud1.onload = function(){
    cloud1_x = 60;
        cloud1_y = 5;
};

// init cloud3
    cloud3 = new Image();
    cloud3.src = 'http://www.flunki.com/templates/celebs_plazza/images/cloud50.png';
    cloud3.onload = function(){
    cloud3_x = max/2;
        cloud3_y = 60;
};
// init cloud5
    cloud5 = new Image();
    cloud5.src = 'http://www.flunki.com/templates/celebs_plazza/images/cloud60.png';
    cloud5.onload = function(){
    cloud5_x = max-180;
        cloud5_y = 35;
};
// init cloud7
    cloud7 = new Image();
    cloud7.src = 'http://www.flunki.com/templates/celebs_plazza/images/cloud70.png';
    cloud7.onload = function(){
    cloud7_x = 200;
        cloud7_y = 75;
};

// init cloud2
    cloud2 = new Image();
    cloud2.src = 'http://www.flunki.com/templates/celebs_plazza/images/cloud60.png';
    cloud2.onload = function(){
    cloud2_x = max-100;
        cloud2_y = 15;
};

// init cloud4
    cloud4 = new Image();
    cloud4.src = 'http://www.flunki.com/templates/celebs_plazza/images/cloud50.png';
    cloud4.onload = function(){
    cloud4_x = max-300;
        cloud4_y = -15;
};

// init cloud6
    cloud6 = new Image();
    cloud6.src = 'http://www.flunki.com/templates/celebs_plazza/images/cloud70.png';
    cloud6.onload = function(){
    cloud6_x = max-560;
        cloud6_y = 8;
};

// init cloud8
    cloud8 = new Image();
    cloud8.src = 'http://www.flunki.com/templates/celebs_plazza/images/cloud40.png';
    cloud8.onload = function(){
    cloud8_x = 0;
        cloud8_y = 38;
};

return setInterval(main_loop, 10);
}

function update(){


cloud1_x -= .05;
if (cloud1_x < -128) {
cloud1_x = max;
}
cloud3_x -= .2;
if (cloud3_x < -128) {
cloud3_x = max;
}
cloud5_x -= .15;
if (cloud5_x < -128) {
cloud5_x = max;
}
cloud7_x -= .1;
if (cloud7_x < -128) {
cloud7_x = max;
}
cloud2_x += .1;
if (cloud2_x>max ) {
cloud2_x  = -128;
}
cloud4_x += .05;
if (cloud4_x>max ) {
cloud4_x  = -128;
}
cloud6_x += .15;
if (cloud6_x>max ) {
cloud6_x  = -128;
}
cloud8_x += .2;
if (cloud8_x>max ) {
cloud8_x  = -128;
}
}

function draw() {

ctx.drawImage(background,0,0);
ctx.drawImage(cloud1, cloud1_x, cloud1_y);
ctx.drawImage(cloud2, cloud2_x, cloud2_y);
ctx.drawImage(cloud3, cloud3_x, cloud3_y);
ctx.drawImage(cloud4, cloud4_x, cloud4_y);
ctx.drawImage(cloud5, cloud5_x, cloud5_y);
ctx.drawImage(cloud6, cloud6_x, cloud6_y);
ctx.drawImage(logo,logopos,0);
ctx.drawImage(cloud7, cloud7_x, cloud7_y);
// ctx.drawImage(cloud8, cloud8_x, cloud8_y);

}

function main_loop() {
    draw();
    update();
}

window.addEvent('domready', function() {
    init();
});
</script>

  </section>
</body>
</html>
1 голос
/ 14 февраля 2012

1) В init() вы используете переменную max, определенную в функции update(), которая вызывается сразу после.Вы должны определить max до или в начале функции init().Я действительно не знаю, почему это иногда даже работает.

2) max = window.innerWidth

window.innerWidth доступен после того, как <body> проанализирован, и ваш сценарий запущен до того, как это произойдет- иногда (когда кэш очищен) у него достаточно времени, чтобы загрузить все необходимые вещи DOM и вычислить window.innerWidth

Я вижу, что вы используете mootools, поэтому вы можете избежать использования вашей функции init() в событии DOMReady

window.addEvent('domready', function() {
    init();
});

3) Никто не отвечает вам, потому что ваш код беспорядок, узнать о:

  • Массивы
  • Петли (для)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...