С Новым годом! Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 11.11.2021
Сообщений: 38

Передать переменную из обработчика событий как глобальную

17.03.2023, 21:32. Показов 838. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Объявляю переменную: var rowobj; , затем читаю файл excel и пытаюсь прочитать эту переменную вне обработчика, но не получается. Как в итоге можно сделать ее глобальной?(я понимаю, что внутри обработчика она перезаписывается, а потом не переходит в глобальную, но как это исправить не понимаю)

JavaScript
1
2
3
4
5
6
7
8
reader.addEventListener("loadend", evt => {
     rowobj = evt.target.value;
     var workbook = XLSX.read(evt.target.result, {type: "binary"}),
     worksheet0 = workbook.Sheets[workbook.SheetNames[1]],
      rowobj = XLSX.utils.sheet_to_row_object_array(worksheet0);
      rowobj = JSON.stringify(rowobj);
      
     });
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.03.2023, 21:32
Ответы с готовыми решениями:

Как передать переменные из обработчика события addEventListener в глобальную область видимости?
В ф-ции обработчика события onclick для #param у меня рассчитываются 2 переменные. Как их значение сделать доступным для основного скрипта...

как передать глобальную переменную в класс
Всем привет! подскажите плиз, ответ на такой вопрос? У меня есть массив строк например String str он заполняется при создании...

Как передать глобальную переменную в twig
define("SEASON", 1); как теперь её в файле с расширением twig вывести?

4
88 / 40 / 10
Регистрация: 28.10.2022
Сообщений: 55
18.03.2023, 05:08
В общем смысл в том, чтобы переменная попала в глобальное поле видимости её сперва нужно там объявить, а уже потом записывать в неё данные

Добавлено через 43 минуты
rowobj = evt.target.value; вы записываете свойство значения события в переменную rowobj
rowobj = XLSX.utils.sheet_to_row_object_array(worksheet0); перезаписываете переменную помещая в неё таблицу exel
rowobj = JSON.stringify(rowobj); снова перезаписываете переменную, записывая в неё строку преобразуя через Node
если вам нужно чтобы после перезаписи переменная читалась тогда как выше я описал.
если же вам нужно чтобы в глобальном поле видимости считывался промежуточный перезаписываемый вариант переменной на пример этот rowobj = XLSX...., тогда у меня для вас плохие новости..., никак, скрипт выполняется последовательно создали переменную, записали в ней, записали снова, записали снова, записали снова и в итоге в ней будет информация записанная в самый последний раз, выход только создавать другую переменную и в ней записывать, ну или после записи запустить функцию в которой нужно считать переменную в данный момент выполнения и передать в ней это значение
JavaScript
1
2
var XLRowObject = XLSX.utils.sheet_to_row_object_array
var jsonObject = JSON.stringify
Это конечно замечательно что JS позволяет в себя пихать как угодно, но вы должны понимать что в структурном коде переменная должна нести смысл, у вас получается переменная rowobj используется аж для 3-х по смыслу разных вещей, а именно сперва хранит в себе значение, затем хранит данные преобразованной переменной worksheet0, а затем в обще хранит в себе строку JSON...
0
0 / 0 / 0
Регистрация: 11.11.2021
Сообщений: 38
18.03.2023, 08:16  [ТС]
Мне нужно, чтобы в глобальную rowobj был записана эта строка: rowobj = JSON.stringify(rowobj); , то есть данные уже перезаписанные в формат json. Пыталась через тертью переменную, но все равно выводит как undefined
То есть при выводе таким способ в консоль:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
var rowobj;
 
 reader.addEventListener("loadend", evt => {
     var workbook = XLSX.read(evt.target.result, {type: "binary"}),
     worksheet0 = workbook.Sheets[workbook.SheetNames[1]],
      rowobj = XLSX.utils.sheet_to_row_object_array(worksheet0);
      console.log(rowobj);
      rowobj = JSON.stringify(rowobj);
      console.log(rowobj);
     });
     console.log(rowobj);
В 7 строке мне выводится переменная, а в 9 нет. Хотя я объявила var rowobj как глобальную.
0
Эксперт JS
 Аватар для DrType
6553 / 3624 / 1075
Регистрация: 07.09.2019
Сообщений: 5,877
Записей в блоге: 1
18.03.2023, 08:23
Можно ещё устроить дело так:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
function getRowobj(file) {
  return new Promise((resolve) => {
     reader.addEventListener("loadend", evt => {
         rowobj = evt.target.value;
         var workbook = XLSX.read(evt.target.result, {type: "binary"}),
         worksheet0 = workbook.Sheets[workbook.SheetNames[1]],
         rowobj = XLSX.utils.sheet_to_row_object_array(worksheet0);
         rowobj = JSON.stringify(rowobj);
         resolve(rowobj)  
     });
     reader.readAsBinaryString(file);
  })
}
И вызывать эту функцию в глобальной области:
JavaScript
1
rowobj = await getRowobj(yourFile)
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3809 / 1647 / 428
Регистрация: 14.03.2022
Сообщений: 4,113
18.03.2023, 19:31
Цитата Сообщение от julya_yd Посмотреть сообщение
В 7 строке мне выводится переменная, а в 9 нет. Хотя я объявила var rowobj как глобальную.
Дело не в объявлении, а в асинхронности действий...
Ты уже сморишь значение переменной, а само чтение еще не завершено.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.03.2023, 19:31
Помогаю со студенческими работами здесь

Как правильно передать глобальную переменную в поток
Помогите разобраться, Запускаю n - раз один экземпляр потока (создается 2 компонента на против нужной ноды в TreeView1), через...

Как передать значение запроса select в глобальную переменную sqlite?
здравствуйте. Помогите начинающему! в c# sqlite делаю sql запрос к базе данных, нужно занести результат запроса в переменную. Select...

Как объявить переменную что бы ее можно было передавать из одного обработчика событий в другой
как объявить переменную что бы ее можно было передавать из одного обработчика событий в другой пример из private: System::Void...

Как заменить глобальную переменную на параметр функции. Передать файл в качестве параметра
Нужно передать xml файл в качестве параметра в функцию sharedStringParse , избавиться от XML_PATH1 , т.к. в моем случае он не канает. Как...

Как передать переменную из одной функции-обработчика в другую?
void __fastcall TForm1::ListBox1Click(TObject *Sender) { int var = something(); } void __fastcall...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru