Проблема возникает из-за блокировки потока выполнения кода в цикле `while`. В JavaScript однопоточная модель исполнения кода, поэтому когда цикл `while` выполняется, он занимает весь поток выполнения и не позволяет браузеру обновлять пользовательский интерфейс (включая прокрутку страницы).
Решение проблемы заключается в том, чтобы использовать асинхронные функции или методы, чтобы освободить поток выполнения. В данном случае можно использовать метод `setTimeout`, чтобы задержать каждую итерацию цикла и дать браузеру возможность обновить интерфейс перед продолжением выполнения кода.
Вот пример решения:
```javascript
var max_tickets = 0;
function calibration() {
var calibration_cancel = false;
function insertBlock() {
var newElems = $('<tr>')
.append('<td>0</td>')
.append('<td>0</td>');
$('.tables table:first-child').append(newElems);
max_tickets = max_tickets + 1;
}
function checkScroll() {
var block = document.getElementById('block');
var isVerticalScroll = block.scrollHeight > block.clientHeight;
if (isVerticalScroll !== true) {
insertBlock();
} else {
calibration_cancel = true;
console.log(max_tickets);
}
if (!calibration_cancel) {
setTimeout(checkScroll, 0);
}
}
setTimeout(checkScroll, 0);
}
```
В этом примере `checkScroll` вызывается с использованием `setTimeout(checkScroll, 0)`, что позволяет освободить поток выполнения после каждой итерации цикла. Это позволит браузеру обновлять интерфейс, включая прокрутку страницы. Когда условие `isVerticalScroll !== true` становится ложным, вызывается `insertBlock`, а затем, если `calibration_cancel` все еще равно `false`, `checkScroll` вызывается снова через `setTimeout`.