Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   preloader на JS (https://javascript.ru/forum/events/31893-preloader-na-js.html)

serg1911 24.09.2012 23:16

preloader на JS
 
Приветствую. Есть такая задача:
снабдить анимационным прелоадером процесс перехода между страницами сайта (субмиты форм тоже нужно учитывать).

Решил задачу при помощи события window.onbeforeunload, но вот опера не захотела нормально работать, решение посмотрел на страничке с багами и решил примерно таким способом для оперы
$('a').bind('click', function(){$.fancybox.showLoading();})
$('form').bind('submit', function(){$.fancybox.showLoading();})

и вроде все норм, но вот в чем беда, при переходе по ссылке анимация не крутится а показывает только первый кадр:-E, я попытался написать так:
$('a').bind('click', function(){
$.fancybox.showLoading();
 setTimeout(function(href){
                document.location.href = href;
                }, 500, this.href);
                return false;
})

Но проблема не решилась, пол секунды покрутилась и потом при изменении document.location.href все равно замерзает анимация:help:
Посоветуйте чего нибудь плз!

trikadin 25.09.2012 00:31

Если я правильно понял, что вам нужно, то у вас есть только один вариант - перерисовывать странички ручками (т.е. из JS), подтягивая данные аяксом и меняя url через pushState. Тогда и анимацию можно запилить, и старлеток с покером.

serg1911 25.09.2012 01:35

trikadin, не это не вариант из-за одного браузера делать аякс для аплода не кошерно. Нужно чтобы при переходе между страницами сайта появлялась анимация (я беру её из фансибокса), проблема в том, чтобы не замерзала анимация, когда происходит переход по ссылке на сайте (причем только когда я запускаю анимацию из события $('a').bind('click', ...).

trikadin 25.09.2012 02:48

serg1911, у вас нету других вариантов, просто вы этого не понимаете. Разберём, как происходит переход на другую страницу сайта (грубо):
- Вы нажимаете на ссылку (к примеру)
- Обрабатывается событие onclick ссылки - т.е., выполняется ваш скрипт, начинает что-то там крутиться. Если событие по умолчанию для браузера не отменено - начинается переход на другую событие (следующие пункты)
- Выполняется событие onbeforeunload - т.е выполняется ваш скрипт, если таковой был. Ещё что-то начинает крутиться.
- Текущая страница стирается целиком - т.е. останавливается действие всех скриптов, удаляется весь DOM. Т.е., ваша анимация перестаёт крутиться.
- Загружается новая страница - для неё выстраивается DOM, загружаются картинки и так далее.

Вывод очевиден: ваша анимация обречена на прерывание в момент стирания всего DOMа текущей страницы. Следовательно, если вы хотите, чтобы она не прерывалась, единственный вариант - всё делать через аякс.

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

serg1911 25.09.2012 10:39

trikadin, спасибо за ответ довольно исчерпывающий. Но есть еще момент! Анимация стопорится только при клике на ссылку, а если вызывается субмит формы то работает идеально. Эти события браузер по разному что ли обрабатывает?
Сейчас есть доступ к исходнику, который используется для вывода анимации:
function showPreloader() {
$.fancybox.showLoading();
};

function onAnchorClick() {
           var expr = new RegExp('^(http|https|ftp)\\://[/a-zA-Z0-9_\\-.?=&]*$', 'ig'); 
          //check another page url 
           if(expr.test(this.href)){  
               showPreloader();
              //start animate half second
               setTimeout(function(href){
                document.location.href = href;
                }, 500, this.href);
                return false;
           }
           return true;
        }
function onFormSubmit() {
         showPreloader();
 return true;
        }        

$(function(){
    if($.browser.opera){
        $('a').bind('click', onAnchorClick);
        $('form').bind('submit', onFormSubmit);
    }else{
        window.onbeforeunload = showPreloader;  
    }
    
});

trikadin 25.09.2012 13:17

Цитата:

Сообщение от serg1911
Анимация стопорится только при клике на ссылку, а если вызывается субмит формы то работает идеально. Эти события браузер по разному что ли обрабатывает?

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

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

serg1911 26.09.2012 16:09

Ясно, спасибо. А иначе как нибудь можно еще прелоадер подобный сделать?

trikadin 26.09.2012 19:36

Цитата:

Сообщение от serg1911
А иначе как нибудь можно еще прелоадер подобный сделать?

Я бы для начала задался вопросом, а есть ли в этом смысл. Пользователь и так знает, что перейдёт на другую страницу и надо подождать. Анимировать это смысла нет.

bes 26.09.2012 23:01

загружайте во фрейм, после загрузки распахивайте фрейм на весь экран и так на всех страницах, чем дольше ходишь по ссылкам, тем больше вложенных фреймов получится

trikadin 27.09.2012 00:22

bes, а я искренне хотел, чтобы ему никто не рассказал об этом.

Правда, ты какое-то странное предложил решение. Достаточно сделать фрейм один раз, а в родителе установить скрипт, который будет выдавать на весь экран загрузку при перезагрузке фрейма.

Но то, что это очень убого - факт.

bes 27.09.2012 00:29

Цитата:

Сообщение от trikadin
bes, а я искренне хотел, чтобы ему никто не рассказал об этом.

:-?
Цитата:

Сообщение от trikadin
Но то, что это очень убого - факт.

:yes:

serg1911 01.10.2012 10:34

Спасибо всем, разобрался.

Jex 02.10.2012 19:54

<html>
<head>
<title></title>
<script type='text/javascript'>
function showContent(link, block_id, loading_id)
{
var cont = document.getElementById(block_id);
var loading = document.getElementById(loading_id);
cont.innerHTML = loading.innerHTML;

<!-- Здесь изменения до перехода, например: cont.style.opacity = '0,2'; -->

    var http = createRequestObject();
   if( http )
    {
    	http.open('get', link);
     	
      	http.onreadystatechange = function ()
		{
			if(http.readyState == 4)
			{
<!-- Здесь изменения после перехода, например: cont.style.opacity = '1'; -->
   				cont.innerHTML = http.responseText;
			}
		}
        http.send(null);
  	}
	else
	{
		document.location = link;
	}
}

function createRequestObject()
{
	try
	{
		return new XMLHttpRequest();
	}
	catch(e)
	{
        try
        {
        	return new ActiveXObject('Msxml2.XMLHTTP');
        }
        catch(e)
        {
            try
            {
            	return new ActiveXObject('Microsoft.XMLHTTP');
            }
            catch(e)
            {
            	return null;
            }
        }
	}
}
</script>
</head>

<body id="body">

<div id="loading"></div>
<div id="content">
<span  onclick='send_message("content.php", "content", "loading");'>Next Page</span>
</div>

</body>
</html>

trikadin 03.10.2012 02:18

Jex, сурово) Сделайте красивее.

Jex 03.10.2012 03:51

<html>
<head>
<title></title>
<script type='text/javascript'>
function showContent(link, block_id, loading_id){
var cont = document.getElementById(block_id);
var loading = document.getElementById(loading_id);
cont.innerHTML = loading.innerHTML;
<!-- Здесь изменения до перехода, например: cont.style.opacity = '0,2'; -->
var http = createRequestObject();
if( http ){
http.open('get', link);
http.onreadystatechange = function (){
if(http.readyState == 4){<!-- Здесь изменения после перехода, например: cont.style.opacity = '1'; -->
cont.innerHTML = http.responseText;}}
http.send(null);}else{document.location = link;}}
function createRequestObject(){try{
return new XMLHttpRequest();}
catch(e){try{
return new ActiveXObject('Msxml2.XMLHTTP');}
catch(e){try{
return new ActiveXObject('Microsoft.XMLHTTP');}
catch(e){return null;}}}}
</script>
</head>
<body id="body">
<div id="loading"></div><div id="content"><span  onclick='send_message("content.php", "content", "loading");'>Next Page</span></div>
</body>
</html>


Как мог, как сказать, так сказать)


Часовой пояс GMT +3, время: 19:28.