Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.10.2017, 19:36
Аспирант
Отправить личное сообщение для mxup Посмотреть профиль Найти все сообщения от mxup
 
Регистрация: 18.06.2015
Сообщений: 38

Блокировка с таймаутом (обратным отсчётом) кнопки после её нажатия
Здравствуйте, на сайте имеется кнопка для того, чтобы при регистрации запросить СМС на телефон.
Так вот, хочу сделать, чтобы был какой то интервал между запросами СМС. Для этого думаю сделать, чтобы кнопка деактивировалась (то есть на неё нельзя было нажать) на 3 минуты и рядом появлялся таймер с обратным отсчётом.
Помогите плиз как это сделать средствами JavaScript
Код кнопки:
Код:
<input id="send_sms" name="send_sms" type="button" value="Получить код в СМС">
Ответить с цитированием
  #2 (permalink)  
Старый 04.10.2017, 20:14
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

jquery timer отключение кнопки на несколько минут с индикацией и localStorage
mxup,

<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script>
$(function() {
    $.fn.Timer = function Timer(obj) {
        var def = {
            from: 5E3,
            duration: 5E3,
            to: 0,
            callback: null,
            step: function(now, fx) {
                $(fx.elem).html(now | 0)
            }
        };
        var opt = $.extend({}, def, obj);
        return this.each(function(indx, el) {
            $(el).queue(function() {
                el.n = opt.from;
                $(el).dequeue()
            });
            $(el).animate({
                n: opt.to
            }, {
                easing: "linear",
                duration: opt.duration,
                step: opt.step,
                complete: opt.callback
            })
        })
    };
    var end = +localStorage.getItem("end")||0, duration = 180 * 1E3;
    $("#send_sms").on("click", function (event) {
    var time = (new Date).getTime(),
    d = duration;
    if (end && end > time) {
          event.stopPropagation();
          d = end - time;
        }
    else {
       localStorage.setItem("end", time + duration);
    }
    var f = d/1000|0;
        var text = this.defaultValue;
        $(this).prop({
            disabled: true
        }).Timer({
            step: function(now, fx) {
                var a = Math.trunc(now);
                var b = ['секунда','секунды','секунд'];
                a = `${a} ${b[1 == a % 10 && 11 != a % 100 ? 0 : 2 <= a % 10 && 4 >= a % 10 && (10 > a % 100 || 20 <= a % 100) ? 1 : 2]}`;
                fx.elem.value = `текст ${a} текст`;
            },
            from: f,
            duration: d,
            to: 0,
            callback: function() {
                localStorage.setItem("end", "0");
                $(this).prop({
                    disabled: false
                }).val(text)
            }
        })
    })
    if (end && end > (new Date).getTime()) $("#send_sms").click();

});
  </script>
</head>

<body>
<input id="send_sms" name="send_sms" type="button" value="Получить код в СМС" >
</body>
</html>

Последний раз редактировалось рони, 08.05.2020 в 17:44.
Ответить с цитированием
  #3 (permalink)  
Старый 04.10.2017, 20:22
Профессор
Отправить личное сообщение для Rasy Посмотреть профиль Найти все сообщения от Rasy
 
Регистрация: 17.06.2016
Сообщений: 509

mxup,
/**

TODO:
- Клик на кнопку. Добавить атрибут disabled.
- Записать в локалсторэдж время в миллисекундах с 1 января 1970 года до текущего момента.
- Добавить 180000 миллисекунд. Записать в локалсторэдж сумму. (теперь есть две метки времени: начальная и конечная).
- Запустить таймер с задержкой равной разницы двух меток времени в миллисекундах, т.е 180000 миллисекунд (3 минуты). По окончанию таймера удалить атрибут disabled у кнопки... Удалить ключи из локального хранилища...
- При обновлении страницы переопределять метку в локалсторэдж время в миллисекундах с 1970 года до текущего момента. Снова вычислить разницу двух меток, передать аргумент разницы в функцию с таймером и запустить отсчет.

*/
Ответить с цитированием
  #4 (permalink)  
Старый 04.10.2017, 20:31
Аспирант
Отправить личное сообщение для mxup Посмотреть профиль Найти все сообщения от mxup
 
Регистрация: 18.06.2015
Сообщений: 38

Ваш вариант для того чтобы при обновлении страницы таймер не сбрасывался на начальное значение?
Ответить с цитированием
  #5 (permalink)  
Старый 04.10.2017, 20:34
Профессор
Отправить личное сообщение для Rasy Посмотреть профиль Найти все сообщения от Rasy
 
Регистрация: 17.06.2016
Сообщений: 509

mxup,
Мой? Ага, такая логика.
Ответить с цитированием
  #6 (permalink)  
Старый 04.10.2017, 20:51
Аспирант
Отправить личное сообщение для mxup Посмотреть профиль Найти все сообщения от mxup
 
Регистрация: 18.06.2015
Сообщений: 38

Сообщение от Rasy Посмотреть сообщение
mxup,
Мой? Ага, такая логика.
Да, логика хорошая, только реализация небось сложноватая.
Ответить с цитированием
  #7 (permalink)  
Старый 04.10.2017, 21:07
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Rasy,
спасибо
внесены изменения в пост №2
Ответить с цитированием
  #8 (permalink)  
Старый 04.10.2017, 21:10
Профессор
Отправить личное сообщение для Rasy Посмотреть профиль Найти все сообщения от Rasy
 
Регистрация: 17.06.2016
Сообщений: 509

рони,
Не за что. Мне до твоего скилла еще пахать и пахать

Последний раз редактировалось Rasy, 04.10.2017 в 21:18.
Ответить с цитированием
  #9 (permalink)  
Старый 05.10.2017, 10:59
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

рони, можете объяснить почему вы использовали побитовое ИЛИ?
step: function(now, fx) {
	$(fx.elem).html(now | 0)
}

PS. Я не понимаю как работаю побитовые операторы.
Ответить с цитированием
  #10 (permalink)  
Старый 05.10.2017, 11:23
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

подозреваю, что здесь это округление до целого.

аналог Math.floor, но только если число не больше максимального int32
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исчезновение кнопки после нажатия ham134 Общие вопросы Javascript 5 10.05.2021 09:46
Скрипт для рандомного показа текста после нажатия на кнопку. Светлана777 Общие вопросы Javascript 0 25.11.2012 00:08
Как вернуться к месту нажатия ссылки после скроллинга? galva74 jQuery 2 02.05.2012 10:41
Кнопка с отсчетом времени до нажатия forroboform Элементы интерфейса 3 02.04.2011 13:55
Сохранение результата ajax запроса после нажатия 'back' gregOlsen AJAX и COMET 5 18.11.2009 12:23