Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Поменять свойство disable в зависимости от времени. (https://javascript.ru/forum/events/74766-pomenyat-svojjstvo-disable-v-zavisimosti-ot-vremeni.html)

hacklife 07.08.2018 08:48

Поменять свойство disable в зависимости от времени.
 
Добрый день! Я новичек и мне нужна помощь.
У меня есть форма с кнопкой. Как сделать данную кнопку активной в определенное время каждый день? Например кнопка всегда неактивна, кроме с 16 00 до 17 00 каждый день
<form action="" method="post">

<input type="hidden" name="do" value="payeer_pay">
<input type="hidden" name="antipovtor" value="<?=time();?>">


<table width="930" height="21px" border="0" cellpadding="0" cellspacing="0">
<tbody><tr>
<td align="center">



<br><b>Введите сумму вклада (от <?=$mindep?> до <?=$maxdep?> рублей) </b> <br> <br><input style="text-align:center;" name="m_amount" type="text" value="100" size="5" maxlength="10"><input type="submit" name="submit2" value="Сделать вклад" class="reg"></td>
</tr>

Пробовал вот этот способ переделать, но не получилось

<script>

$(function() {
// установить кнопки свойство disabled, равное true (т.е. сделать её не активной)
$('input[type="submit"]').prop('disabled', true);
// при отпускании клавиши, проверить значение данного поля
$('input[name="m_amount"]').keyup(function() {
// если значение не равно пустой строке
if($(this).val() != '') {
// то сделать кнопку активной (т.е. установить свойству disabled кнопки значение false
$('input[type="submit"]').prop('disabled', false);
}
});
});
</script>
С пустым значением работает.

рони 07.08.2018 09:03

hacklife,
это ограничение лучше сделать на сервере, любой сможет отменить 'disabled' на клиенте, и время на клиенте у каждого своё

j0hnik 07.08.2018 09:07

<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
	<input type="submit" name="submit2" value="Сделать вклад" class="reg">
	<script>
		$(function(){
			var date = new Date();
			(function dis(){
				$('input[type="submit"]').prop('disabled', date.getHours() !== 16);
				setTimeout(dis,1000);
			})();
		});
	</script>


но лучше сервер, переведите на компе время и кнопка станет активной

hacklife 07.08.2018 10:20

Цитата:

Сообщение от j0hnik (Сообщение 491976)
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
	<input type="submit" name="submit2" value="Сделать вклад" class="reg">
	<script>
		$(function(){
			var date = new Date();
			(function dis(){
				$('input[type="submit"]').prop('disabled', date.getHours() !== 16);
				setTimeout(dis,1000);
			})();
		});
	</script>


но лучше сервер, переведите на компе время и кнопка станет активной

Как можно сделать проверку на сервере?

Nexus 07.08.2018 10:23

if(date('H')==16){
    //do something
};

hacklife 07.08.2018 11:00

Цитата:

Сообщение от Nexus (Сообщение 491987)
if(date('H')==16){
    //do something
};

Можно на примере выше показать как встроить эту проверку? И ещё: как заблокировать отправку формы по нажатию Enter? Буду премного благодарен.

laimas 08.08.2018 07:05

hacklife, if(date('H')==16) будет означать, что условие для для всех клиентов определяется временем сервера. Блокировать кнопку можно, а можно вообще не выводить на страницу форму. Но так или иначе этого мало, обмануть при желании всегда можно, а значит блокирование, это чисто для клиента, а сервер же должен всегда проверять время при приеме формы и не принимать ее если не соблюдается условие.

hacklife 08.08.2018 09:46

Цитата:

Сообщение от laimas (Сообщение 492097)
hacklife, if(date('H')==16) будет означать, что условие для для всех клиентов определяется временем сервера. Блокировать кнопку можно, а можно вообще не выводить на страницу форму. Но так или иначе этого мало, обмануть при желании всегда можно, а значит блокирование, это чисто для клиента, а сервер же должен всегда проверять время при приеме формы и не принимать ее если не соблюдается условие.

Доброе утро! Я это понимаю. Проблема в том что пытаюсь прописать условие, и ограничение не работает. Ограничение по времени клиента работает. Возможно я что-то неверно делаю.

laimas 08.08.2018 10:33

Цитата:

Сообщение от hacklife
Ограничение по времени клиента работает.

Каким образом сервер будет знать о времени клиента?

hacklife 08.08.2018 11:44

Я имею ввиду данный вариант работает. А мне нужно что бы для любого часового пояса было одинаково, по времени МСК.
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

    <input type="submit" name="submit2" value="Сделать вклад" class="reg">

    <script>

        $(function(){

            var date = new Date();

            (function dis(){

                $('input[type="submit"]').prop('disabled', date.getHours() !== 16);

                setTimeout(dis,1000);

            })();

        });

    </script>

laimas 08.08.2018 11:54

Цитата:

Сообщение от hacklife
Я имею ввиду данный вариант работает.

И в чем же заключается "работа"?

Dilettante_Pro 08.08.2018 13:37

Цитата:

Сообщение от hacklife
для любого часового пояса было одинаково, по времени МСК

Перевод даты на московское время
var tzoffset = (new Date()).getTimezoneOffset() * 60000; 
    var date = (new Date(Date.now() + tzoffset + 10800000 ));
alert(date);

laimas 08.08.2018 14:16

Dilettante_Pro, к западу и востоку смещения часовых поясов имеют разные знаки.

Dilettante_Pro 08.08.2018 15:06

laimas,
И что? Расчет будет неправильно работать?
Для Москвы, например, tzoffset = -10800000
И что из этого?

laimas 08.08.2018 15:31

А как оно может работать правильно, если вычисление будет слева направо, а значит знак может быть не учтен? Либо разность смещений вычитаем, либо в общем выражении выносим их в скобки.
Мало того, у вас московское смещение всегда отрицательно, и будет верно только для тех кто восточнее Гринвича, а кто сказал, что запросы не могут быть с западных. Корректнее смешение сервера передавать самому серверу на клиента. Сервер в отличие от клиента передает их с противоположным знаком - для восточных положительные, для западных отрицательные.

hacklife 08.08.2018 16:08

Цитата:

Сообщение от laimas (Сообщение 492107)
И в чем же заключается "работа"?

Кнопка активна только с 16 часов до 17 часов. Но корректно работает только если не переводить время специально, т.к. время берется с компьютера пользователя. У меня к данному промежутку времени привязано событие. И надо сделать так чтобы никто не мог схитрить и переведя часы на минуту вперед нажать кнопку раньше других.

hacklife 08.08.2018 16:15

На данный момент весь кусок кода выглядит вот так

<form action="" method="post" onkeydown="if(event.keyCode==13){return false;}" >
    	

		<input type="hidden" name="do" value="payeer_pay">
		<input type="hidden" name="antipovtor" value="<?=time();?>">


			<table width="930" height="21px" border="0" cellpadding="0" cellspacing="0">
			<tbody><tr>
				<td align="center">
				
				
								 <br><b>Введите сумму вклада (от <?=$mindep?> до <?=$maxdep?> рублей)    Кнопка "Сделать вклад" станет активной во время рестарта </b> <br> <br><input style="text-align:center;" name="m_amount" type="text" value="100" size="5" maxlength="10"><input type="submit" name="submit2" value="Сделать вклад" class="reg"  </td>
			</tr>
			
				
				
				
			
		  </tbody></table>
		</form>


<script>

$(function() {
  
  $('input[type="submit"]').prop('disabled', true);
  
  $('input[name="m_amount"]').keyup(function() {
    
    if($(this).val() != '') {
                 
      $('input[type="submit"]').prop('disabled', false);
    }
  });
});
</script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

    
    <script>
        
        $(function(){

            var date = new Date();

            (function dis(){

                $('input[type="submit"]').prop('disabled', date.getHours() !== 16);

                setTimeout(dis,1000);

            })();

        });

    </script>

Malleys 08.08.2018 16:16

Цитата:

Сообщение от hacklife
мне нужно что бы для любого часового пояса было одинаково, по времени МСК.

<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<input type="submit" name="submit2" value="Сделать вклад" class="reg">
<script>
	
	$(function(){
		(function dis(){
			$('input[type="submit"]').prop('disabled', (Date.now() / 1000 / 3600 % 24 | 0) !== 13);
			setTimeout(dis, 1000);
		})();
	});

</script>

laimas 08.08.2018 16:34

Цитата:

Сообщение от hacklife
И надо сделать так чтобы никто не мог схитрить и переведя часы на минуту вперед нажать кнопку раньше других

Этого нельзя гарантировать никаким JS, да и чтобы вы там не блокировали на клиенте, главное, это серверу не принять форму некорректную, и тут гарантией может быть как раз только то, что все работают по времени сервера (выше показано, использовать временную метку, она абсолюта). Сервер обязан проверять при приеме формы время и если соответствует, принимать. Вот только в этом случае, это будет работать.

Dilettante_Pro 08.08.2018 16:38

Цитата:

Сообщение от laimas
А как оно может работать правильно, если вычисление будет слева направо, а значит знак может быть не учтен? Либо разность смещений вычитаем, либо в общем выражении выносим их в скобки.
Мало того, у вас московское смещение всегда отрицательно, и будет верно только для тех кто восточнее Гринвича, а кто сказал, что запросы не могут быть с западных. Корректнее смешение сервера передавать самому серверу на клиента. Сервер в отличие от клиента передает их с противоположным знаком - для восточных отрицательные, для западных положительные.

С какого бы направления они ни были - getTimezoneOffset() приходит со своим знаком, для тех, кто восточнее - с минусом, кто западнее - с плюсом.
Далее по формуле убираем их местное смещение и добавляем отрицательное московское. Вот и все. Время московское, что и хотел ТС.

Насчет того, что клиент может подкрутить часы - это да, на клиенте с этим не справиться. Только сервер.

laimas 08.08.2018 17:00

Dilettante_Pro, проверьте на какой либо фиксированной метке.

Dilettante_Pro 08.08.2018 17:43

laimas,
Спасибо.
Проверил по Бразилии, исправил Пост 12. Теперь работает нормально


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