IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Веб-программирование (http://www.imho.ws/forumdisplay.php?f=29)
-   -   Странички отражающие процесс (http://www.imho.ws/showthread.php?t=47394)

Himan 31.12.2003 12:30

Странички отражающие процесс
 
Народ!
Расскажите мне как эта хрень работает, и что нужно сделать?
Я так понимаю, что когда юзер обращается на веб-сервер тот организовывает сессию (поток) и закрывает его тогда, когда полностью ответил пользователю (переслал страничку например). А если пользователь обратился к серверу (передал данные какие-то) и тот должен показать страничку с ходом выполнения (в процентах). В данном случае, я так понимаю, после передачи странички сессия не закрывается, а закрывается когда полностью процесс выполнен. Как в таком случае мне заставить браузер (а может и сервер) обновлять страничку через какое-то время (например каждые 5 сек.)?

Спасибо.

Saruman 31.12.2003 13:39

Himan
Имхо, на html/dhtml ты такого не сделаешь. Везде, где я видел разного розда реализации, суть была в том, что просто вешалась анимированная гифка с прогресс баром, которая после загрузки заменялась на реальные загруженные данные. Сделать это можно с помощью двух div-ов, но, естественно, этот прогресс бар реальный прогресс загрузки не отображает.
Реальные же счетчики я видел только реализованные на флеше.

Himan 31.12.2003 15:13

Меня собственно не сам прогресс бар интересует и в общем-то и не загрузка страницы... Допустим сервер должен что-то сделать, например переписать с одного места пачку файлов в другое. Пользователь обращается на ссылку и сервер принимается за работу, а впроцессе работы скидывает в браузер странички, отражающие ход выполнения (выполнено то-то...). Я знаю что в ХТМЛ-е есть какие-то теги, указывающие время перезагрузки. Но тогда возникает вопрс, а как сервер пределяет что это именно тот юзер (без куков). Выходит сервер сессию не закрывает, а как-то постянн скидывает страницы. Так вот меня интересует сам механизм и какую страницу (какие тэги) должен сервак передавать?:confused:

Saruman 31.12.2003 15:58

Himan
Это можно легко сделать в рамках _одной_ страницы. По мере выполнения задачи сервер будет выдавать html-код на страницу, который так же постепенно будет на ней появляться. К примеру, если на пхп это делать:
PHP код:

echo "<html><body>Start<br>";
flush();
myLongFunction();
echo 
"Function 1 complete<br>";
flush();
myLongFunction2();
echo 
"Function 2 complete<br>";
flush();

... 
etc... 

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

А если тебе нужно именно на _нескольких_ страницах последовательно прогресс показать - то тут выход один - разбивать скрипт на несколько скриптов.

RaZEr 01.01.2004 17:31

2 Saruman: Браузер с таких случаях часто выходит на таймаут (для IE - 60 сек. по умолчанию).

PS: А делается все предельно просто. И способов хватает. Самый простой из них (HTML/JS/DOM) это скрытый auto-refresh фрейм. Из него основная страница и считывает те самые проценты (или другие единицы), на основании которых рисуется полоска (если она вообще рисуется).

Saruman 01.01.2004 19:40

RaZEr
Если что-то в него выдавать периодически - не выходит. У меня так логи процессов по 20-30 минут спокойно работали, постоянно что-то выдавая в браузер. Под IE. Насчет других браузеров - не знаю.

Stasik 01.01.2004 21:18

Saruman
это зависит от типа стрима...... и от настроек

Himan 02.01.2004 11:58

Спасибо за отзывы, но не могли бы вы мне накалякать пару примеров. Дело в том, что я не большой спец в ХТМЛ и ДжСкрипте. Вот например итересен пример с логами.

AleXXXSoft 02.01.2004 14:44

пишем так:
PHP код:

echo "<input type=text size=6 id=test name=test>";
echo 
"<script language=javascript>";
for(
$i=0;$i<100000;$i++){
echo 
"test.value='".$i."';\n";
flush();
};
echo 
"</script>"

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

Makc 02.01.2004 15:08

Код:

<html>
<head>
<title>JavaScript - LoadingBar</title>

<!-- HEAD START HERE -->

<style type="text/css">
#divLoadCont {position:absolute; z-index:500; left:0px; top:0px; width:100%; height:98%; clip:rect(0px 100% 100% 0px); background-color:#ffffff; layer-background-color:#ffffff;}
#divLoad1    {position:absolute; layer-background-color:silver; background-color:silver;}
#divLoad2    {position:absolute; left:0px; top:0px; layer-background-color:navy; background-color:navy;}
#divLoadText {position:absolute; background-color:transparent; font-family:arial,helvetica,sans-serif; color:navy; font-size:14px;}
</style>
<script language="JavaScript" type="text/javascript">
/********************************************************************************** 
LoadingBar
*  Copyright (C) 2001 Thomas Brattli
*  This script was released at WOscripts.com
*  Visit for more great scripts!
*  This may be used and changed freely as long as this msg is intact!
*  We will also appreciate any links you could give us.
*********************************************************************************/

function lib_bwcheck(){ //Browsercheck (needed)
        this.ver=navigator.appVersion
        this.agent=navigator.userAgent
        this.dom=document.getElementById?1:0
        this.opera5=this.agent.indexOf("Opera 5")>-1
        this.ie5=(this.ver.indexOf("MSIE 5")>-1 && this.dom && !this.opera5)?1:0;
        this.ie6=(this.ver.indexOf("MSIE 6")>-1 && this.dom && !this.opera5)?1:0;
        this.ie4=(document.all && !this.dom && !this.opera5)?1:0;
        this.ie=this.ie4||this.ie5||this.ie6
        this.mac=this.agent.indexOf("Mac")>-1
        this.ns6=(this.dom && parseInt(this.ver) >= 5) ?1:0;
        this.ns4=(document.layers && !this.dom)?1:0;
        this.bw=(this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.opera5)
        return this
}
var bw=new lib_bwcheck()



/*VARIABLES TO SET START: */
numImages = 10    //How many images you have in your page
loaderWidth = 300 //The width of the loadbar
/*
All other settings, like colors fonts and stuff like that you
have to change in the STYLE section.

IMPORTANT:
To make this actually show the correct results
you have to place THIS code in all images:
onload="loadIt(1)"

Which means that your image should look
something like this:
<img src="whatever.gif" width="10" border="0" height="10" onload="loadIt(1)">


VARIABLES TO SET END: */



// A unit of measure that will be added when setting the position of a layer.
var px = bw.ns4||window.opera?"":"px";

currentImg = 0
//Document size object ********
function lib_doc_size(){
  this.x=0;this.x2=bw.ie && document.body.offsetWidth-20||innerWidth||0;
  this.y=0;this.y2=bw.ie && document.body.offsetHeight-5||innerHeight||0;
  if(!this.x2||!this.y2) return message('Document has no width or height')
  this.x50=this.x2/2;this.y50=this.y2/2;
  return this;
}

//Lib objects  ********************
function lib_obj(obj,nest){
  nest=(!nest) ? "":'document.'+nest+'.'
  this.evnt=bw.dom? document.getElementById(obj):bw.ie4?document.all[obj]:bw.ns4?eval(nest+"document.layers." +obj):0;       
  this.css=bw.dom||bw.ie4?this.evnt.style:this.evnt;
  this.ref=this.css
  this.w=this.evnt.offsetWidth||this.css.clip.width||
    this.ref.width||this.css.pixelWidth||0;
  return this
}
//Moving object to **************
lib_obj.prototype.moveIt = function(x,y){
  this.x=x; this.y=y; this.css.left=x+px; this.css.top=y+px;
}
//Clipping object to ******
lib_obj.prototype.clipTo = function(t,r,b,l,setwidth){
  this.ct=t; this.cr=r; this.cb=b; this.cl=l
  if(bw.ns4){
    this.css.clip.top=t;this.css.clip.right=r
    this.css.clip.bottom=b;this.css.clip.left=l
  }else{
    if(t<0)t=0;if(r<0)r=0;if(b<0)b=0;if(b<0)b=0
    this.css.clip="rect("+t+"px "+r+"px "+b+"px "+l+"px)";
    if (setwidth){
                this.css.pixelWidth = r;
                this.css.pixelHeight = b;
                this.css.width = r+px;
                this.css.height = b+px;
        }
  }
}
var oLoad2
function startLoading(){
  page = new lib_doc_size()
  oLoadCont = new lib_obj('divLoadCont')
  oLoad = new lib_obj('divLoad1','divLoadCont')
  oLoad2 = new lib_obj('divLoad2','divLoadCont.document.divLoad1')
  oLoadText = new lib_obj('divLoadText','divLoadCont.document.divLoad1')
  oLoad.moveIt(page.x50-loaderWidth/2,page.y50-20)
  oLoadText.moveIt(loaderWidth/2 - oLoadText.w/2,10)
  oLoad.clipTo(0,loaderWidth,40,0,1)
  oLoad2.per = loaderWidth/numImages
}
function loadIt(ok){
  currentImg ++
  if (oLoad2) oLoad2.clipTo(0,oLoad2.per*currentImg,40,0,1)
  if (!ok){
    oLoadCont.css.visibility = "hidden"
    oLoadCont = null;
        oLoad1 = null;
        oLoad2 = null;
  }
}

//DISPLAY FUNCTION - DELETE START -------- DELETE THIS *************
//LEAVE THIS FUNCTION WHILE TESTING. DELETE WHEN READY
function loadIt_display(ok){
  currentImg ++
  if (oLoad2) oLoad2.clipTo(0,oLoad2.per*currentImg,40,0,1)
  if (currentImg<=numImages) setTimeout("loadIt_display(1)",200)
  else{
    oLoadCont.css.visibility = "hidden"
  }
}
//DISPLAY FUNCTION - DELETE END *************************************
</script>

<!-- HEAD END HERE -->




</head>
<body bgcolor="#737994" text="#FFFFFF" link="#FFFFFF" topmargin="0" leftmargin="0">



<!-- BODY START HERE -->


<!-- ALWAYS HAVE THIS RIGHT AFTER THE BODY START TAG -->
<div id="divLoadCont">
  <div id="divLoad1">
    <div id="divLoad2"></div><br>

    <div id="divLoadText">Loading...</div>
  </div>
</div>
<script>
startLoading()
//onload=loadIt; //- LEAVE THIS LINE WHILE TESTING. UNCOMMENT WHEN READY
loadIt_display(1) //LEAVE THIS LINE WHILE TESTING. DELETE WHEN READY
</script>


<!-- BODY END HERE -->

<br><br><br>
<center>
Содержание страницы
<br><br>
</center>
</body>
</html>


AleXXXSoft 02.01.2004 15:16

и что должно происходить? я пока вижу только ошибки в броузере, жалобы на отсутствие обьектов и прочую дрянь... :confused:

Добавлено через 1 минуту:
хоть бы комментировал как-то..... представляешь я щас кусок кода в 30 кб сюда всуну и скажу, что работает, как к этому отнесуться? одно дело, если он действительно работает, и всем влом в нем ковыряться, а другое - если нет.

Stasik 02.01.2004 21:13

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

shuron 02.01.2004 21:49

да в глазах рябит... от таких скриптов с непонятных страниц

Makc 03.01.2004 20:47

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

AleXXXSoft 04.01.2004 06:00

т.е. он просто так пробегает)) для понту, мол, типа грузимся+) что -то типа первого прогресс бара в инсталлшилде 99-м =) сразу так от 0 до 99% а дальше висюк=)

shuron 04.01.2004 14:48

да нет вроде он в зависимоти от прогресса загрузки картинок кажет
но не проверял

Добавлено через 47 минут:
нет всётаки он не отражает действительный статус загрузки картинок..
а жаль.. что не прошол испытаний...
может подправит кто..


Часовой пояс GMT +4, время: 21:29.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.