Почему выборка будет выполняться только тогда, когда ее нет в функции? - PullRequest
0 голосов
/ 13 мая 2019

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

Я пытался Google это, но я не нашел ничего, что помогло бы мне. Я добавил оператор console.log, чтобы убедиться, что функция вызывается, и это так.

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

функция JavaScript:

function myFunction(){


    fetch('https://sickw.com/api.php?format=html&key=SOME_KEY&imei=12908438754328705&service=999999')
      .then(response => response.text())
      .then(data => {
        //document.write(data)
        console.log(data)
      });

    //make sure the function was called
    console.log("hiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
}

HTML-код:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />

  <title>Ghibli App</title>

  <link href="https://fonts.googleapis.com/css?family=Dosis:400,700" rel="stylesheet" />
  <link href="style.css" rel="stylesheet" />
</head>

<body>
  <div id="root"></div>

  <form>
    <select id="carrier">
      <option value="carrier">Carrier</option>
      <option value="icloud">iCloud</option>
    </select>
    <button onClick="myFunction('carrier');">Submit</button>"
  </form>

  <script src="scripts.js"></script>
</body>

</html>

Я ожидаю, что появится страница с сообщением "Ошибка S01: неверный идентификатор службы!" однако, когда я вызываю код из myFunction (), страница совсем не меняется.

1 Ответ

1 голос
/ 13 мая 2019

Почему вы ничего не видите:

Проблема не в том, что вы вызываете fetch из функции, а в том, что вы вызываете эту функцию внутри onclick кнопки в форме.

Когда вы помещаете элемент <button> в элемент <form>, его поведение по умолчанию - отправка формы (публикация результатов на другой веб-странице и загрузка этой новой страницы в браузер). Поскольку ваша форма не имеет атрибута action, она просто перезагрузит текущую страницу. Эта перезагрузка текущей страницы приводит к тому, что вы не видите никаких результатов.

Исправление первой проблемы:

Чтобы предотвратить возврат формы, вам нужно вызвать preventDefault() в случае события, переданного вашей функции:

function myFunction(event){
    event.preventDefault();

    fetch('https://sickw.com/api.php?format=html&key=SOME_KEY&imei=12908438754328705&service=999999')
      .then(response => response.text())
      .then(data => {
        //document.write(data)
        console.log(data)
      });

    //make sure the function was called
    console.log("hiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
}

Второй выпуск

Однако из-за способа вызова этой функции (передачи ее методу onclick элемента HTML) у вас нет доступа к этому событию. Чтобы исправить это, вы должны использовать метод addEventListener следующим образом:

document.getElementsByTagName("button")[0].addEventListener("click", myFunction);

Если вы дадите кнопке идентификатор, его можно заменить на:

document.getElementById("button-id").addEventListener(...)

Третий выпуск

Вы передаете 'carrier' непосредственно в вашу функцию, но я предполагаю, что вы хотите прочитать значение из элемента <select>. Для этого вы должны использовать document.getElementById и .value, чтобы прочитать выбор:

var carrier = document.getElementById("carrier").value;

Как только вы это сделаете, вы можете использовать carrier в вашем fetch запросе

Четвертый номер

Как уже упоминали другие в комментариях, вам следует избегать звонков на document.write. Есть книги, написанные о том, почему это плохо, но правильный ответ - использовать DOM API для изменения элементов на странице. Например:

var p = document.createElement("p");
p.innerHTML = data;
document.appendChild(p);

Финальный код

index.html

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />

  <title>Ghibli App</title>

  <link href="https://fonts.googleapis.com/css?family=Dosis:400,700" rel="stylesheet" />
  <link href="style.css" rel="stylesheet" />
</head>

<body>
  <div id="root"></div>

  <form>
    <select id="carrier">
      <option value="carrier">Carrier</option>
      <option value="icloud">iCloud</option>
    </select>
    <button id="button-id">Submit</button>"
  </form>

  <script src="scripts.js"></script>
</body>

</html>

script.js

function myFunction(event){
    event.preventDefault();
    var carrier = document.getElementById("carrier").value;
    fetch('https://sickw.com/api.php?format=html&key=SOME_KEY&imei=12908438754328705&service=999999&carrier=' + carrier)
      .then(response => response.text())
      .then(data => {
          var p = document.createElement("p");
          p.innerHTML = data;
          document.appendChild(p);
      });
}

document.getElementById("button-id").addEventListener("click", myFunction);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...