Как получить доступ к глобальной переменной в другой функции

У меня есть глобальная переменная «ввод», и ее значение присваивается в функции processinput. Но если я попытаюсь получить доступ к значению input внутри другой функции, значение будет отображаться как неопределенное.

Код:

<!DOCTYPE html>
<html>
  <head>
    <meta charset = "UTF-8">
    <meta http-equiv = "X-UA-Compatible" content = "IE=edge">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
    <title>Visualization</title>
    <link rel = "stylesheet" href = "style.css">
    <script src = "https://cdn.plot.ly/plotly-1.58.5.min.js"></script>
    <style>
      /* Your CSS styles here */
    </style>
  </head>
  <body>
    <div class = "graph-container">
      <div id = "network" class = "main-panel"></div>
      <div id = "graph" class = "side-panel">
        <div class = "arrow"></div>
      </div>
    </div>

    <label for = "quantity">Enter the value</label>
    <input type = "text" id = "quantity">
    <button id = "submit" onclick = "processInput()">Submit</button>

    <script>
      var input;
      function processInput() {
        input = document.getElementById("quantity").value;
        console.info(input);
      }

      document.addEventListener("DOMContentLoaded", function() {
        // Rest of your code...
        console.info(input);
        // Fetch JSON data, initialize graph, and set up event listeners

      });
    </script>
  </body>
</html>

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

Обновлено: Спасибо за комментарии. Например, если я попытаюсь отобразить значение input вне функции processInput, оно будет неопределенным.

<!DOCTYPE html>
<html>
  <head>
    <meta charset = "UTF-8">
    <meta http-equiv = "X-UA-Compatible" content = "IE=edge">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
    <title>Visualization</title>
    <link rel = "stylesheet" href = "style.css">
    <script src = "https://cdn.plot.ly/plotly-1.58.5.min.js"></script>
    <style>
      /* Your CSS styles here */
    </style>
  </head>
  <body>
    <div class = "graph-container">
      <div id = "network" class = "main-panel"></div>
      <div id = "graph" class = "side-panel">
        <div class = "arrow"></div>
      </div>
    </div>

    <label for = "quantity">Enter the value</label>
    <input type = "text" id = "quantity">
    <button id = "submit" onclick = "processInput()">Submit</button>

    <script>
      var input;
      function processInput() {
        input = document.getElementById("quantity").value;
        console.info(input);
      }

      function test() {
        // Rest of your code...
        console.info(input);
        // Fetch JSON data, initialize graph, and set up event listeners

      };
      console.info(input);

    </script>
  </body>
</html>

К моменту пожара DOMContentLoaded ни у кого не будет времени ввести что-либо в поле. В противном случае ваш код будет работать нормально.

AKX 30.06.2023 08:58

В предоставленном вами коде кажется, что вы пытаетесь записать значение ввода сразу после того, как документ готов (DOMContentLoaded). Однако значение input устанавливается только при вызове функции processInput(), то есть при нажатии кнопки «Отправить».

Erhan Çapar 30.06.2023 09:00

@AKX Не могли бы вы проверить правку?

Natasha 30.06.2023 09:06

@ErhanÇapar Не могли бы вы увидеть правку? Я хотел бы знать, как получить доступ к значению глобальной переменной вне функции processInput.

Natasha 30.06.2023 09:07

Вы никогда не вызываете функцию test

Konrad 30.06.2023 09:07

@Наташа Достаточно просто ввести имя переменной, чтобы получить доступ к переменной вне функции processInput, поскольку переменная определена вне функции.

Erhan Çapar 30.06.2023 09:09

@Konrad Я сомневаюсь, что если значение input установлено внутри функции processInput, могу ли я получить к нему доступ в другом месте. Например, я пытался сделать console.info(input); вне функции (см. строку ниже тестовой функции).

Natasha 30.06.2023 09:11

@ Наташа Опять же, к тому времени, когда сработает последний console.info(input), ни у кого не будет времени вызвать processInput, чтобы присвоить значение.

AKX 30.06.2023 09:11

Путешествия во времени не существует

Konrad 30.06.2023 09:12

@AKX спасибо за разъяснения. Не могли бы вы подсказать, как изменить код, чтобы он заработал? Прошу прощения за наивный вопрос.

Natasha 30.06.2023 09:13

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

Konrad 30.06.2023 09:18

@Конрад Спасибо. Я хочу получить глобальный доступ к значению input, потому что я присваиваю значение другой переменной на основе этого значения `var nscale = [input * 0.1, input, input * 10];`, но вне функции processInput.

Natasha 30.06.2023 09:28

@ Наташа Хорошо, тогда ... просто сделай это внутри функции? Что бы вы сделали с этим nscale тогда?

AKX 30.06.2023 09:35

Массив @AKX nscale используется для определения steps для определения ползунков графа сети plotly.js plotly.com/javascript/sliders . Если я включу остальную часть скрипта в функцию processInput, то график графика не будет виден во внешнем интерфейсе.

Natasha 30.06.2023 11:39

@Natasha Это станет видно, как только вы введете значение. Но вам придется взглянуть на API в Plotly, чтобы изменить steps для создания графика...

AKX 30.06.2023 12:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
15
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша глобальная входная переменная не имеет значения при загрузке страницы. И он никогда не будет иметь значения сразу после того, как вы что-то ему присвоите. Что вы и делаете, но в своей функции processInput(), которая вызывается только при нажатии кнопки отправки.

Javascript запускается, как только вы загружаете страницу, и он напечатает неопределенную глобальную входную переменную еще до того, как вы вызовете функцию processInput().

Я предлагаю вам присвоить значение, как только javascript запустится следующим образом:

<script>

// This way your input will contain a reference to the element which has an id of "quantity"
var inputElem = document.getElementById("quantity");

// Prints nothing because the input element has no assigned default value
console.info( inputElem.value );

</script>

В вашей функции ввода процесса вы можете присвоить значение другой переменной, если хотите, примерно так:

<script>

var inputElem = document.getElementById("quantity");
var inputText;

/*
This function will be called on submit button click and it will add
the value of the inputElem to the inputText variable. Later you can 
use inputText anywhere.
*/
function processInput(){
    inputText = inputElem.value;
}

// The below code still prints nothing because the processInput() function does not run at this point in time.
console.info(inputText);    

</script>

Другие вопросы по теме