Проблема с setTimeout
есть простая страница, которая на вход принимает *.csv и выдаёт *.pdf. сначала есть только кнопка загрузить файл, после загрузки-обработки появляется кнопка скачать пдф, которая запускает библиотеку makePdf и отдаёт готовый файл.
если на вход подаётся небольшой файл, то проблем нет. при увеличении размера страница выглядит подвисшей, даже алерт появляется. поэтому была добавлена промежуточная функция function runBuildPDF() { spinner.classList.add('spinner_shown'); button.classList.remove('download_shown'); setTimeout(() => { buildPdf() }, 10); } что привело к необъяснимому поведению: первый запуск всегда приводит к рестарту страницы. то есть нажимаем загрузить csv, далее загрузить пдф и страница тут же возвращается в исходное положение. даже если поставить большой таймаут - он просто игнорится. все последующие разы всё работает как и ожидается. |
Вы правда думаете, что проблема в этих 4х строчках кода, а не в том, где и как эта функция вызывается?
|
Цитата:
- если убрать setTimeout и вызывать сразу buildPdf(), рестарта страницы нет. - не имеет значения вызов функции происходит ли <button class="download" type="submit" onclick="runBuildPDF()">Скачать PDF</button> или <form class="form" action="#" id="form" onchange="proceedUploadedFile(event)" onSubmit="runBuildPDF()"> Результат тот же. Удалось понять, что именно добавление setTimeout приводит к рестарту. Причём проблема появляется только (!!!) при 1ом запуске, все последующие работают как и должны. Хотелось бы понять корень проблемы. |
Цитата:
Я, признаться, подобного метода объявления слушателей события (через html-атрибуты) уже давным-давно не видел и не помню как передать событие в слушатель. Но если предположить, что функция «proceedUploadedFile» корректно получает событие формы в кач-ве аргумента, то вы можете попробовать сделать так: <form class="form" action="#" id="form" onchange="proceedUploadedFile(event)" onSubmit="runBuildPDF(event)"> function runBuildPDF(event) { event.preventDefault() spinner.classList.add('spinner_shown'); button.classList.remove('download_shown'); setTimeout(() => { buildPdf() }, 10); } Почему у вас форма отправляется только первый раз - непонятно, без кода сложно сказать. |
Часовой пояс GMT +3, время: 22:17. |