Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.06.2024, 12:34
Новичок на форуме
Отправить личное сообщение для HuXT Посмотреть профиль Найти все сообщения от HuXT
 
Регистрация: 24.06.2024
Сообщений: 2

Проблема с setTimeout
есть простая страница, которая на вход принимает *.csv и выдаёт *.pdf. сначала есть только кнопка загрузить файл, после загрузки-обработки появляется кнопка скачать пдф, которая запускает библиотеку makePdf и отдаёт готовый файл.
если на вход подаётся небольшой файл, то проблем нет. при увеличении размера страница выглядит подвисшей, даже алерт появляется. поэтому была добавлена промежуточная функция
function runBuildPDF() {
  spinner.classList.add('spinner_shown');
  button.classList.remove('download_shown');
  setTimeout(() => {
    buildPdf()
  }, 10);
}

что привело к необъяснимому поведению: первый запуск всегда приводит к рестарту страницы. то есть нажимаем загрузить csv, далее загрузить пдф и страница тут же возвращается в исходное положение. даже если поставить большой таймаут - он просто игнорится. все последующие разы всё работает как и ожидается.
Ответить с цитированием
  #2 (permalink)  
Старый 24.06.2024, 13:27
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Вы правда думаете, что проблема в этих 4х строчках кода, а не в том, где и как эта функция вызывается?
Ответить с цитированием
  #3 (permalink)  
Старый 24.06.2024, 13:58
Новичок на форуме
Отправить личное сообщение для HuXT Посмотреть профиль Найти все сообщения от HuXT
 
Регистрация: 24.06.2024
Сообщений: 2

Сообщение от Nexus Посмотреть сообщение
Вы правда думаете, что проблема в этих 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ом запуске, все последующие работают как и должны.
Хотелось бы понять корень проблемы.
Ответить с цитированием
  #4 (permalink)  
Старый 24.06.2024, 17:29
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Сообщение от HuXT
Хотелось бы понять корень проблемы.
Проблема в том, что вы не предотвращаете поведение формы по умолчанию.
Я, признаться, подобного метода объявления слушателей события (через 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);
}


Почему у вас форма отправляется только первый раз - непонятно, без кода сложно сказать.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает сброс таймера (setTimeout и clearInterval) stankhat Events/DOM/Window 3 05.02.2015 16:55
Проблема с setTimeout kdlinny Events/DOM/Window 5 27.01.2014 15:09
Проблема с радио кнопками px379 Общие вопросы Javascript 8 29.07.2013 09:30
Проблема со вставкой setTimeout в скрипт MasterDmx Общие вопросы Javascript 3 13.06.2013 01:37
Аргументы в setTimeout - проблема в IE 6 micscr Общие вопросы Javascript 8 28.09.2009 13:08