Для того чтобы функция автоматически отключалась при закрытии вкладки браузера, можно использовать обработчик события `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`, которая отслеживает, был ли получен бонус. При закрытии вкладки до завершения таймера, текст во вкладке не изменится на "Ошибка" и выдача бонуса будет отменена.