Javascript.RU

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

Обработчик paste блокирует изменение DOM
Уважаемый коллективный разум!

Очень нужна помощь в решении такой задачи. Есть обработчик вставки табличных данных из буфера обмена в веб-таблицу, производящий некоторые расчеты. Это может занимать ощутимое время для больших таблицы, поэтому в начале надо показать спинер, а в конце - спрятать его.

Пытаюсь это делать с помощью такого кода:
const globalDivShowSpinner = document.getElementsByClassName("show_spinner")[0];

// очищаем HTML при вставке текста
document.addEventListener('paste', async function(e) {
  var bufferText = ((e.originalEvent || e).clipboardData || window.clipboardData).getData('Text');
  e.preventDefault();

  let lines = bufferText.split(/\r?\n/).filter(Boolean);
  if(!lines.length) {
    console.log('Нечего вставлять');
    return;
  }

  // cells = createTableFromLines(lines);
  if(globalDivShowSpinner != null && typeof globalDivShowSpinner != "undefined") {
    globalDivShowSpinner.style.display='block';
    console.log('globalDivShowSpinner.style.display => '+globalDivShowSpinner.style.display);     
  }

  let delta_idx = 0; // смещение чтения данных в случае, если первая колонка содержит номер позиции

  for(let i = 0; i < lines.length; i++) {
    let current_line = lines[i];
    let cells = current_line.split(/\t/);
    cells = cells.filter(function(str) { return /\S/.test(str); }); // убираем пустые строки

    let delta_idx = 0; // смещение чтения данных в случае, если первая колонка содержит номер позиции

    // проверяем, является ли первая колонка порядковым номером
    if(cells[0].match(/^[0-9\.]+$/) !== null) {
      delta_idx = 1;
    }
    // если в строке только 1 колонка, это - название раздела
    if(cells.length == 1+delta_idx) {
      addNewChapter(cells[delta_idx]);
      continue;
    }
    // Пустое наименование позиции => пропускаем
    if(!cells[delta_idx].length) {
      continue;
    }
    // заменяем ',' на '.' в числовых полях:
    if(cells.length > delta_idx+2 && typeof cells[delta_idx+2] !== "undefined" && !isNaN(parseFloat(cells[delta_idx+2]))) {
      cells[delta_idx+2] = cells[delta_idx+2].replace(',','.');
    }
    if(cells.length > delta_idx+3 && typeof cells[delta_idx+3] !== "undefined" && !isNaN(parseFloat(cells[delta_idx+3]))) {
      cells[delta_idx+3] = cells[delta_idx+3].replace(',','.');
    }
    addNewCustom(1,0,cells[delta_idx],cells[delta_idx+1],cells[delta_idx+2],cells[delta_idx+3]);
  }
  updateTotal();

  //document.body.removeChild(spinner);
  if(globalDivShowSpinner != null && typeof globalDivShowSpinner != "undefined") {
    globalDivShowSpinner.style.display='none';
    console.log('*** HERE WE GO ***');
  }
});


Спинер реализован следующим образом.

CSS:
.show_spinner {
			position:fixed;top:0;right:0;bottom:0;left:0;
			background: rgba(0,0,0,0.5) url(/images/spinners/Gear.gif) no-repeat 50% 50%;
			z-index:100;
			background-size: 10ex;
		}

HTML:
<div class="show_spinner" style="display:none"></div>


В итоге, на консоль выводится 'globalDivShowSpinner.style.display => block' (отладочная печать непосредственно перед отображением спинера), но сам спинер не показывается. Если вручную поменять в HTML style="display:block", спинер конечно показывается.

В чем здесь проблема? Я джун в JS и уже сломал весь мозг, прошу помочь разобраться.
Ответить с цитированием
  #2 (permalink)  
Старый Вчера, 19:36
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,297

Сообщение от max97
В чем здесь проблема?
Если коротко... Пока работает скрипт, браузер ничего рисовать не будет.
А когда у тебя закончится скрипт - спинер будет выключен.

Т.ч. включил спинер... Запускай все остальное через setTimeout()... И уже там выключай спинер.

Сообщение от max97
document.addEventListener('paste', async function(e) {...})
async зачем?
Ответить с цитированием
  #3 (permalink)  
Старый Вчера, 19:39
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,297

Сообщение от max97
Я джун в JS
Коренное заблуждение.
Джуниор разработчик знает ЯП и его основы.
Т.ч. ты пока просто новичок в JS.

Сколько уже успел прочитать учебников по JS?
Ответить с цитированием
  #4 (permalink)  
Старый Вчера, 21:06
Новичок на форуме
Отправить личное сообщение для max97 Посмотреть профиль Найти все сообщения от max97
 
Регистрация: 17.10.2025
Сообщений: 3

Сообщение от ksa Посмотреть сообщение
Если коротко... Пока работает скрипт, браузер ничего рисовать не будет.
А когда у тебя закончится скрипт - спинер будет выключен.

Т.ч. включил спинер... Запускай все остальное через setTimeout()... И уже там выключай спинер.
Спасибо! Через setTimeout() все отработало как надо!
Ответить с цитированием
  #5 (permalink)  
Старый Вчера, 21:08
Новичок на форуме
Отправить личное сообщение для max97 Посмотреть профиль Найти все сообщения от max97
 
Регистрация: 17.10.2025
Сообщений: 3

Сообщение от ksa Посмотреть сообщение
Если коротко... Пока работает скрипт, браузер ничего рисовать не будет.
А когда у тебя закончится скрипт - спинер будет выключен.

Т.ч. включил спинер... Запускай все остальное через setTimeout()... И уже там выключай спинер.


async зачем?
Сообщение от ksa Посмотреть сообщение
Коренное заблуждение.
Джуниор разработчик знает ЯП и его основы.
Т.ч. ты пока просто новичок в JS.

Сколько уже успел прочитать учебников по JS?
Согласен: скорее не джун, а нуб

Читаю вот этот учебник, порекомендовали старшие товарищи
Ответить с цитированием
  #6 (permalink)  
Старый Вчера, 22:27
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,777

Сообщение от max97 Посмотреть сообщение
Читаю вот этот учебник, порекомендовали старшие товарищи
Не знаю, что там в разных учебниках написано, но async функцию делают в двух случаях.
- Если в самой функции надо ждать оператором await окончания других асинхронных функций.
- Или функция должна вернуть промис. Хотя, в этом случае, промис можно вернуть и обычной функцией.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
возможно ли повесить обработчик на изменение класса в тэге? AleksSergSB Общие вопросы Javascript 2 20.05.2020 09:07
Изменение состояния DOM denysdovhan Events/DOM/Window 10 27.05.2014 12:54
DOM изменение andrey-kun02 Учебные материалы 2 05.06.2013 12:30
Повесить событие на изменение DOM nebaz Events/DOM/Window 5 17.06.2012 15:15
Изменение параметра "ALT"("TITLE") тега IMG посредством DOM Гость Элементы интерфейса 3 21.02.2008 10:02