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-шником?

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

Nexus 22.04.2017 15:40

arkadii_parovozov, я смотрю Вы любите извращаться.
Ресурсоемкость зависит от реализации.

Nexus 22.04.2017 15:44

<div class="magazin">
    <div class="bloki" data-id="<?php echo $row['id'];?> data-minutes="<?=$row['time'];?>"></div>
    <div class="bloki" data-id="<?php echo $row['id'];?> data-minutes="<?=$row['time'];?>"></div>
</div>

<script type="text/javascript">
	$(function(){
		var cur_time=(new Date()).getTime()/1000;//Время от которого буду устанавливать сдвиг.
		$('.magazin>[data-minutes]').each(function(){
			$(this).text(cur_time+parseFloat($(this).attr('data-minutes')));
		});
	});
</script>

laimas 22.04.2017 15:58

Цитата:

Сообщение от Nexus
$(this).attr('data-minutes')

В JQ значение этого атрибута лучше получать как data('minutes').

$(this).text(cur_time+$(this).data('minutes'));

Если к примеру атрибут будет содержать json формат, то такое обращение вернет готовый объект.

arkadii_parovozov 22.04.2017 16:17

)) Извращаюсь потому что я с js на "Вы". Спасибо за пример!

arkadii_parovozov 22.04.2017 16:19

laimas,
Спасибо!

Nexus 22.04.2017 16:20

Цитата:

Сообщение от laimas (Сообщение 450677)
В JQ значение этого атрибута лучше получать как data('minutes').

$(this).text(cur_time+$(this).data('minutes'));

Если к примеру атрибут будет содержать json формат, то такое обращение вернет готовый объект.

Читал, что "jq" метод "data" кэширует результаты, поэтому всегда юзаю attr.
К тому же из data-атрибута ожидаются вполне определенные данные имеющие тип int или float.

К чему приведет (float)cur_time+(object)$(this).data('minutes'), к NaN?

laimas 22.04.2017 16:33

Цитата:

Сообщение от Nexus
метод "data" кэширует результаты

Не путайте метод date() привязывающий к объекту переменные с получением данных из атрибута. Например, у объекта атрибут data-a. При выполнение метода data({a : 1}) объекту будет добавлена переменная "a" к атрибуту data-a отношения не имеющая.

Цитата:

Сообщение от Nexus
К чему приведет (float)cur_time+(object)$(this).data('minutes'), к NaN?

Проверить то не сложно, что все будет Ок.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script> 
$(function() {
    $.each($('p'), function() {
        alert($(this).data('m')+5)
    })
});
</script> 
</head>
<body>
<p data-m="123"></p>
<p data-m="123.4"></p>
</body>
</html>

Nexus 22.04.2017 16:46

Цитата:

Сообщение от laimas (Сообщение 450677)
Если к примеру атрибут будет содержать json формат, то такое обращение вернет готовый объект.

Цитата:

Сообщение от laimas (Сообщение 450689)
Проверить то не сложно, что все будет Ок.
<p data-m="123"></p>
<p data-m="123.4"></p>

Во втором параграфе (<p>) json формат?
Я предполагал, что вы имеете ввиду несколько другой тип данных.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
	$('p').last().attr('data-m',JSON.stringify({foo:'bar'}));
	$('p').each(function(){
		alert($(this).data('m')+5);
	});
});
</script>
</head>
<body>
<p data-m="123"></p>
<p data-m="json"></p>
</body>
</html>

laimas 22.04.2017 16:49

Ну здрасьте, я же не сумасшедший, коли работаю с числами мною же определенными, то уж точно знаю чего ожидать. :)

Nexus 22.04.2017 16:57

Цитата:

Сообщение от laimas (Сообщение 450695)
Ну здрасьте, я же не сумасшедший, коли работаю с числами мною же определенными, то уж точно знаю чего ожидать. :)

При работе с числами и parseFloat + jq.attr пойдет.
Спасибо за информацию о jq.data, приму к сведению.

laimas 22.04.2017 17:00

Цитата:

Сообщение от Nexus
При работе с числами и parseFloat + jq.attr пойдет

Я и не говорю, что не годится, просто data() проще и возвращает уже готовое.


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