AJAX часыКакой самый большой недостаток скрипта часов на JavaScript? Правильно - они показывают время пользовательской машины, которое вполне может быть неверным. А какой самый большой недостаток скрипта часов на PHP? Правильно - они статичны и отображают время сервера на момент загрузки страницы. AJAX скрипт лишен обоих недостатков:
function showClock() {
var obj = document.getElementById('clock');
var req;
if (window.XMLHttpRequest) req = new XMLHttpRequest();
else if(window.ActiveXObject) {
try {
req = new ActiveXObject('Msxml2.XMLHTTP');
} catch (e){}
try {
req = new ActiveXObject('Microsoft.XMLHTTP');
} catch (e){}
}
if (req) {
req.onreadystatechange = function() {
if (req.readyState == 4 && req.status == 200)
{ obj.innerHTML = 'Московское время '+req.responseText; }
};
req.open("POST", 'xmlhttp.php', true);
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
req.send('clock=1&ajax=1');
}
else alert("Браузер не поддерживает AJAX");
}
setInterval(showClock, 3000);
Серверная часть:
echo date('H:i:s');
Комментарии:ламо 24.06.08 в 20:35 А для ламеров поподробней мона было? Dimko 26.06.08 в 19:30 У этих часиков тоже есть недостаток - страница постоянно хавает трафик. Но думаю если не отображать секунды, и увеличить интервал до минуты, то этот недостаток тоже будет не существенным. Xel 29.08.08 16:23 можно и секунды отображать ) просто часы надо делать так - ajax грузить время с сервера, а отображать и изменять уже javascript Иван 22.09.08 16:27 На этом примере видно не меньше "подводных камней" ajax, чем его достоинств. Мало того, то сами ответы приходят асинхронно и с разной задержкой, так еще и сам javascript ничего не гарантирует при установлении интервала в 1000мс. Попробуйте переключиться на другую вкладку в браузере/другое приложение и вернуться обратно - секунды могут начать изменяться вообще в произвольном порядке, даже не по возрастанию. Gorky 27.09.08 21:44 Вообще лучше всего конечно просто брать время на стороне сервера (например с помошью php) а потом с помощью JS запускать их на стороне клиента и никаких проблем. А так спасибо за статьи, помогло. :-) Vladimir 02.02.09 13:38 Чёто у меня не запускается скрипт.... пусто, ничего не выводит. Если не сложно, помогите разобраться пожалуйста. Dmitriy 25.02.09 04:13 Все просто супер, работает на ура! Огромное спасибо АВТОРУ за то, что он написал этот скрипт. Очень искал! Arris 31.07.09 04:50 В отображаемых комментариях перед двойными кавычками везде идет лишний слэш :( Deft 30.08.09 14:40 >> Вообще лучше всего конечно просто брать время на стороне сервера (например с помошью php) а потом с помощью JS запускать их на стороне клиента и никаких проблем. А так спасибо за статьи, помогло. :-)
// Часы - int
var hour = 0;
// Минуты - int
var minute = 0;
// Минуты - int
var second = 0;
// Общее время - char[]
var time = '';
// Дополнительный флаг
var timeChanged = 1;
// Возможно пользователь захочет остановить часы
var timerEnabled = 1;
// Получаем время от серверного скрипта
function ajax_time() {
//...
// В конце разбиваем полученное время и записываем по отдельности его в переменные hour, minute, second.
// Общее время записываем в переменную time.
}
function timeDelayer() {
// Проверяем включен ли таймер
if (!timerEnabled) return;
// Будем вызывать каждую секунду отдельную функцию
if (timeChanged)
setTimeout("time_proceed", 1000);
timeChanged = 0;
// Рекурсивно вызываем эту функцию
timeProceed();
}
function timeProceed() {
second++;
if (second >= 60) {
minute++;
second = 0;
}
if (minute >= 60) {
hour++;
minute = 0;
}
var cHour = second;
var cMinute = minute;
var cSecond = hour;
// Т.к. переменные целочисленные, то в них может содержаться только по одной цифре, будет выглядеть не очень красиво (типа 1:5:3, а надо 01:05:03), проверим это.
// Не C++ и преобразование типов нам не нужно
if (second < 10) cSecond = "0" + second;
if (minute < 10) cMinute = "0" + minute;
if (hour < 10) cHour = "0" + hour;
// Итоговое время
time = cHour + ":" + cMinute + ":" + cSecond;
// Кроосбраузерность уже самостоятельно прописываем
document.getElemntById("time").innerHTML = time;
timeChanged = 1;
return true;
}
// Функция для остановки таймера
// Делаем кнопочку и для нее событие 'onclick="timeStop();"'
// При остановке таймера и повторном его запуске будет необходима последующая синхронизация с сервером
function timeStop() {
timerEnabled = 0;
return;
}
Функцию timeDelayer необходимо вызывать рекурсивно с проверкой флага состояния, потому что задержка и выполнение функций выполняется асинхронно, т.е. без такого вызова функция не выполнялась бы каждую секунду.Считаю это самым оптимальным методом отображения часов, а сами часы на сайте считаю ненужным бредом, уж извините =) Только если делать на отдельной странице сервис отображающий время в разных странах, ну, или хотя бы точное московское (многим геймерам такое нужно). P.S. Писал прямо в форме ответа для того, чтобы отобразить саму идею, поэтому в примере могут быть ошибки, да и скорее всего они будут. P.S.S. На сайт забрел случайно, так что не пинайте если что =[ Alek Veritov 30.08.09 15:49 согласен с Gorky и Deft, что в случае с часами разумней брать время с сервера только один раз. Deft 01.09.09 16:43 По своему посту скажу: misha_4ever 12.09.09 13:53 спасибо автору!!! Николай 14.03.10 13:07 Хороший наглядный пример работы AJAX. Андрей Шеляков 02.08.11 09:56 Я вчера написал скрипт вроде работает, выдаю его на суд=) человек 24.10.11 19:18 var obj = document.getElementById('clock'); rак вот это понять??? человек 24.10.11 19:25 =) Андрей Шеляков 05.11.11 12:40 obj это название переменной, а document.getElementById('clock') это значение переменной. deny zhirkov 19.02.12 20:25 Если бы автор был в команде с "Тормозом"(brokenbrake.biz) - то цены бы им небыло. Спасибо автору! Владимир 09.04.12 01:24 Андрей Шеляков , document.getElementById('clock') это не значение переменной , а получение экземляра объекта называеться Андрей Шеляков 30.04.12 14:41 Ну да=) Если вам помогла или просто понравилась эта статья вы можете отблагодарить автора кликнув по рекламе. Спасибо! комментировать:
прежде чем писать комментарий убедитесь, пожалуйста, что он не попадает в нижеследующие категории:
прямые оскорбления кого бы то ни было будут удалятся! от кого: |


