Как сделать так, чтобы функция автоматически отключалась при закрытии вкладки браузера?

Как можно изменить скрипт, чтобы при закрытии вкладки до завершения таймера не происходило событие, которое меняет текст во вкладке на "Ошибка", а также отменяла выдачу бонуса? <br/> <br/> 

```javascript
<script>
$('.mav_bonus_item').click(function(event) {
    var el = $(this);
    var sec = 5;
    var timer = $('.timer');
    var timerId = setTimeout(
        function tick() {
            document.title = sec + ' - Ждите';
            timer.html(sec);
            if (sec === 0){
                clearTimeout(timerId);
                if(document.title !== 'Ошибка'){
                    document.title = "Бонус получен!";
                }               
            } else {
                sec--;
                timerId = setTimeout(tick, 1000);
            }      
        }, 1000
    );
    
    $(window).on('beforeunload', function(){
        document.title = "Ошибка";
        clearTimeout(timerId);
    });
    
    setTimeout(function() {
        el.html('<div class="spinner-icon"><i class="fa fa-5x fa-fw fa-pulse fa-spinner text-danger"></i></div>');
        $.ajax({
            url: document.location.href,
            type: "POST",
            dataType: 'json',
            data: {bonus_click:el.data('id')},
            success: function(d){
                if (d.ok) {
                    el.replaceWith(d.amount);
                } else {
                    el.html('<div class="alert alert-danger"><strong>Произошла ошибка :( Перезагрузите страницу.</strong></div>');
                }   
            },
            error: function(){
                el.html('<div class="alert alert-danger"><strong>Произошла ошибка :( Перезагрузите страницу.</strong></div>');
            }   
        });    
    }, 50);
});
</script>
```
  • 29 июня 2024 г. 8:52
Ответы на вопрос 3
Для того чтобы функция автоматически отключалась при закрытии вкладки браузера, можно использовать обработчик события `beforeunload`. Вот измененный скрипт, который отменяет изменение текста на "Ошибка" и отменяет выдачу бонуса при закрытии вкладки до завершения таймера:

```javascript
<script>
var timerId;
var bonusReceived = false;

$('.mav_bonus_item').click(function(event) {
    var el = $(this);
    var sec = 5;
    var timer = $('.timer');
    timerId = setTimeout(
        function tick() {
            document.title = sec + ' - Ждите';
            timer.html(sec);
            if (sec === 0){
                clearTimeout(timerId);
                if(!bonusReceived){
                    document.title = "Бонус получен!";
                }               
            } else {
                sec--;
                timerId = setTimeout(tick, 1000);
            }      
        }, 1000
    );
    
    $(window).on('beforeunload', function(){
        document.title = "Ошибка";
        clearTimeout(timerId);
    });
    
    setTimeout(function() {
        el.html('<div class="spinner-icon"><i class="fa fa-5x fa-fw fa-pulse fa-spinner text-danger"></i></div>');
        $.ajax({
            url: document.location.href,
            type: "POST",
            dataType: 'json',
            data: {bonus_click:el.data('id')},
            success: function(d){
                if (d.ok) {
                    bonusReceived = true;
                    el.replaceWith(d.amount);
                } else {
                    el.html('<div class="alert alert-danger"><strong>Произошла ошибка :( Перезагрузите страницу.</strong></div>');
                }   
            },
            error: function(){
                el.html('<div class="alert alert-danger"><strong>Произошла ошибка :( Перезагрузите страницу.</strong></div>');
            }   
        });    
    }, 50);
});

$(window).on('unload', function(){
    clearTimeout(timerId);
});
</script>
``` 

Этот скрипт также добавляет переменную `bonusReceived`, которая отслеживает, был ли получен бонус. При закрытии вкладки до завершения таймера, текст во вкладке не изменится на "Ошибка" и выдача бонуса будет отменена.
А куда вы выводить document.title=“Ошибка"; собрались, если вкладка закрывается? 
Для вашего случая подойдёт событие https://developer.mozilla.org/en-US/docs/Web/API/W...
А куда вы выводить document.title=“Ошибка"; собрались, если вкладка закрывается? 
Для вашего случая подойдёт событие https://developer.mozilla.org/en-US/docs/Web/API/W...
Похожие вопросы