Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Таймер для нескольких магазинов (https://javascript.ru/forum/misc/68473-tajjmer-dlya-neskolkikh-magazinov.html)

arkadii_parovozov 19.04.2017 10:14

Таймер для нескольких магазинов
 
Всем привет!

Реализовал на своем сайте таймер с добавлением 30 минут к текущему времени таким образом:
setInterval (
   function ()
   {
		$.post( 'include/time_server.php', {'time_new':'1'}, 
			function(data){
				var arr_time = data.split(' ');
				$('.data').val(arr_time[0]);
				$('.time').val(arr_time[1]);
		});
   },
1000);

В файле time_server.php прибавляю 30 минут к текущему времени и вывожу на главной странице (в блоки с классами data и time) ajax-ом. Суть в том что блоков с блоками data и time может быть сколько угодно. И пока мне нужно прибавлять ко всем блокам одинаковое количество минут(30), то все работает нормально, а сейчас возникла необходимость каждому блоку прибавлять разное количество минут(10, 15, 45, 90, ...).

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

А время запрашиваю на сервере, потому что у пользователей часы могут быть настроены по разному.

Dilettante_Pro 19.04.2017 18:55

arkadii_parovozov,
А что такое - каждый блок? чем они различаются? Как time_server.php отличит, кому сколько минут добавлять?
Как function(data) различит, куда какой результат писать?

arkadii_parovozov 20.04.2017 12:34

А что такое - каждый блок? - блоков может быть сколько угодно, каждый блок содержит в себе информацию о конкретном магазине.

чем они различаются? - для пользователя - контентом, для браузера - id-шником.

Как time_server.php отличит, кому сколько минут добавлять? - можно этот параметр записывать в time_new.

Как function(data) различит, куда какой результат писать? - если бы я знал ответ на этот вопрос, то я бы тему не открывал.

Сейчас я решаю этот вопрос таким образом:
?>
<script>
	setInterval (
		function ()
		 {
			$.post( 'include/time_server.php', {'time_new':'<?php echo $row['time']?>'}, 
				function(data){
					var arr_time = data.split(' ');
					$('#data_<?php echo $row['id']?>,#2data_<?php echo $row['id']?>').val(arr_time[0]);
					$('#time_<?php echo $row['id']?>,#2time_<?php echo $row['id']?>').val(arr_time[1]);
				});
		},
	1000);
</script>
<?php

но хотелось бы обойтись одной функцией...

Dilettante_Pro 20.04.2017 15:04

arkadii_parovozov,
Это вы генерите в странице для каждого блока свой скрипт.

Теперь представьте не индивидуальный скрипт, а универсальный,
Крутится setInterval.
По идее, time_server.php должен получать полный перечень индексов блоков с временным сдвигом и возвращать массив сразу для всех блоков - с конкретным индексом блока, датой и временем - и в функции нужно раскидывать полученный массив по всем блокам.
Как-то так.

arkadii_parovozov 20.04.2017 16:07

Ну да. Теперь вопрос в том, что лучше, посылать на сервер 10 000 запросов каждую секунду или посылать один запрос а обрабатываться он будет в 10 000 раз медленнее...

Наверное так оставлю. Буду создавать для каждого блока свой скрипт.

Dilettante_Pro 20.04.2017 16:19

arkadii_parovozov,
А зачем вам 10 000 запросов (и еще 10 000 setInterval) или 10 000 обработок?
У вас что, на странице 10 000 блоков с датой и временем? что это за страница такая? Для кого?

arkadii_parovozov 20.04.2017 17:39

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

Dilettante_Pro 20.04.2017 18:05

arkadii_parovozov,
Представьте себе на карте на экране десктопа (не говорю о смартфоне) 1000000 точек размером хотя бы в 1 пиксел... что там от карты останется?
А если хотя бы 100 блоков дата-время одновременно вывести на экран...
Подумайте над тем, что, когда и как вы отображаете - и, мне кажется, много объектов одновременно не понадобится
Подавать запросы по мере появления объекта на экране.

Nexus 20.04.2017 21:53

Не знаю актуальна ли данная тема...
Сдвиг времени для каждого блока можно затолкать в data-атрибут каждого из блоков с "часами". Далее с сервера можно запросить текущее время, пробежаться по всем блокам с часами прибавляя к полученному с сервера значению сдвиг из data-атрибута. После остается только перезаписать дату-время в блоках.

Не подходит?

arkadii_parovozov 22.04.2017 15:29

О! Вот эта хорошая идея. Запрашивать только дату у сервера, а потом скриптом прибавлять сдвиг времени уже на клиенте.

Схема получается примерно такая:
<div class="magazin">
	<div class="bloki" id="<?php echo $row['id']."_data_".$row['time']?>"></div>
	<div class="bloki" id="<?php echo $row['id']."_time_".$row['time']?>"></div>
</div>

и таких блоков может быть сколько угодно. Получается, скриптом нужно парсить все классы bloki потом вырезать из id "$row['time']" потом прибавлять к времени сервера это значение и выводить обратно в блок с текущем id-шником?

И еще вопрос: много ли ресурсов будет потреблять этот скрипт на клиенте?


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