Что произойдет если пользователь закроет именно это окно? (я называл его ранее мастер-ом). Или все таки обновляет то окно которое запросило данные из сессии раньше? Здесь немного не допонял...Автор оригинала: ksnk
Так как "обновляется" сессия только одним окном
Ну и что? Эталонное время все равно храниться на сервере (в куке). Все остальные ориентируются не по мифическому "мастеру", а по этому эталону...Что произойдет если пользователь закроет именно это окно?
Все въехал в схему, она не подойдет так как при любом действии (в любом из окон) надо сбрасывать таймер в начало отсчета... Так что не эталонное время нужно а синхронизация...Автор оригинала: ksnk
Ну и что? Эталонное время все равно храниться на сервере (в куке). Все остальные ориентируются не по мифическому "мастеру", а по этому эталону...
<html>
<head>
<title>test</title>
<script type="text/javascript" src="./main.js"></script>
</head>
<body onload="iss_timer('begin', 4210);">
<p id="iss_timer">00:00:00</p>
<br><a href="./index.html">new</a><br>
</body>
</html>
function iss_timer(timer_status, timer_left) {
var current_date = new Date();
var current_seconds = Math.round(eval(current_date.getTime())/1000);
if (timer_status == 'begin') {
setCookie("timer_start", current_seconds, "", "", "", "");
setCookie("timer_seconds", timer_left, "", "", "", "");
}
var timer_start = getCookie("timer_start");
var timer_seconds = getCookie("timer_seconds");
var left_seconds = eval(timer_seconds) - (current_seconds - eval(timer_start));
if (left_seconds < timer_left) {
var timer_h = Math.floor(left_seconds / (60 * 60));
var timer_m = Math.floor((left_seconds - (timer_h * 60 * 60)) / 60);
var timer_s = left_seconds - (timer_h * 60 * 60) - (timer_m * 60);
if (timer_h < 10) timer_h = '0' + timer_h;
if (timer_m < 10) timer_m = '0' + timer_m;
if (timer_s < 10) timer_s = '0' + timer_s;
document.getElementById('iss_timer').innerHTML = timer_h + ':' + timer_m + ':' + timer_s;
}
if (left_seconds > 0) setTimeout("iss_timer('continue', " + left_seconds + ");", 10);
else alert('TIMEOUT!');
}
function setCookie(name, value, expires, path, domain, secure) {
document.cookie = name + "=" + escape(value) +
((expires) ? "; expires=" + expires : "") +
((path) ? "; path=" + path : "") +
((domain) ? "; domain=" + domain : "") +
((secure) ? "; secure" : "");
}
function getCookie(name) {
var cookie = " " + document.cookie;
var search = " " + name + "=";
var setStr = null;
var offset = 0;
var end = 0;
if (cookie.length > 0) {
offset = cookie.indexOf(search);
if (offset != -1) {
offset += search.length;
end = cookie.indexOf(";", offset);
if (end == -1) {
end = cookie.length;
}
setStr = unescape(cookie.substring(offset, end));
}
}
return(setStr);
}
Это мысли вслух, или вопрос к общественности?Я честно говоря не знаю из-за этого ли, но в любом случае зачем слишком часто переписывать таймер если он все равно не изменился...
Перестраховался, так что лучше вообще убрать его везде?Интересно, чем объясняется столь широкое использование функции eval? С точки зрения типов и приводимости одного к другому Javascrpipt еще "гибче", чем PHP так что в этих местах eval просто не нужен, а упоминание о нем на этом форуме может быть еще и вредно для здоровья![]()
Вопрос шепотомЭто мысли вслух, или вопрос к общественности?![]()
{ немного чуши почислилВопрос шепотом
Во я искал как это сделать в инете наткнулся на такой способ как у меня думал в JS такого нетНу, если это все-таки вопрос, то:
Чтобы не писать вот так, придумана функция toPrecision
var s=timer_h.toPrecision(2) + ':' + timer_m.toPrecision(2) + ':' + timer_s.toPrecision(2)
Думал я об этом и мне показалось что лучше гонять лишнюю переменную по рекурсии, чем дергать getElementById, ну если это не так то подправлю. Только если не сложно поясните чем так лучше...Чтобы не перерисовывать часто часы достаточно их "не перерисовывать"например так:
var i=document.getElementById('iss_timer');
if (i.innerHtml != s) i.innerHtml=s;
Ну да на сервере лучше так как клиент может вырубить JS и таймер встанет. Но для этого я перестраховываюсь на сервере проверяя время последнего обновления $_SESSION['timeout'] который выставляеться каждый раз в начале.Автор оригинала: BRat
чтобы не зависеть от времени клиента и иметь возможность проверять факт таймаута на сервере
Ну так setcookie на клиенте же выставляет кукисы...$_COOKIE
[m]setcookie[/m]
Почему sajax разве не ajax-библиотека?про ajax вру. у тебя его нет
оптимизатор блинчем дергать getElementById