Почему я не могу динамически создавать html-элемент?

Я хочу создать динамический абзац, поэтому я написал следующий код. После того, как пользователь нажмет кнопку, должен быть добавлен новый абзац, внутренний текст которого является вводом пользователя. Но мне не удалось, кто-нибудь может мне помочь?

var input = document.querySelector(".input");
var btn = document.querySelector("button");
var body = document.querySelector("body");

btn.addEventListener('click', addParagraph);

function addParagraph() {
  var childELes = body.children;
  for (var p in childELes) {
    if (p.tagName === "p")
      p.remove();
  }
  if (input.value.trim() != "") {
    var newPara = document.createElement("p");
    newPara.innerText = input.value;
    body.appendChild(newPara);
  }
}
<!DOCTYPE html>
<html>

<head>
  <title>test</title>
</head>

<body>
  <form>
    <p>
      <label>input:</label>
      <input type = "text" class = "input">
      <button>add</button>
    </p>
  </form>
</body>

</html>

Просто добавьте .preventDefault() при работе с кликами jsfiddle.net/ta9pxbLc/1

Daut 08.04.2019 12:58
Поведение ключевого слова "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
1
61
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

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

var input = document.querySelector(".input");
var btn = document.querySelector("button");
var body = document.querySelector("body");

btn.addEventListener('click', addParagraph);

function addParagraph(e) {
  e.preventDefault();
  var childELes = body.children;
  for (var p in childELes) {
    if (p.tagName === "p")
      p.remove();
  }
  if (input.value.trim() != "") {
    var newPara = document.createElement("p");
    newPara.innerText = input.value;
    body.appendChild(newPara);
  }
}
<form>
  <p>
    <label>input:</label>
    <input type = "text" class = "input">
    <button>add</button>
  </p>
</form>

Добавьте type = "button" в HTML-тег кнопки:

<!DOCTYPE html>
<html>
<head>
    <title>test</title>
</head>
<body>
    <form>
        <p>
            <label>input:</label>
            <input type = "text" class = "input">
            <button type = "button">add</button>
        </p>
    </form>
    <script type = "text/javascript">
    var input = document.querySelector(".input");
    var btn = document.querySelector("button");
    var body = document.querySelector("body");

    btn.addEventListener('click', addParagraph);

    function addParagraph() {
        var childELes = body.children;
        for (var p in childELes) {
            if (p.tagName === "p")
                p.remove();
        }
        if (input.value.trim() != "") {
            var newPara = document.createElement("p");
            newPara.innerText = input.value;
            body.appendChild(newPara);
        }
    }
    </script>
</body>
</html>

Это потому, что кнопка в форме вызывает submit и перезагружает страницу. Вы видите новый p-tag на короткое время. Но страница перезагружается и все p пропало.

Добавьте type = "button" к своей кнопке, чтобы исключить ее как кнопку отправки, или используйте event.preventDefault() в событии кнопки.

Ваш код на 100% правильный, единственная проблема заключается в том, что ваш <button>add</button> выполняет обратную передачу, которая обновляет вашу страницу.

Вам просто нужно добавить тип кнопки в тег кнопки, и она будет работать следующим образом:

<button type = "button">add</button>

Надеюсь это поможет

Вы можете просто добавить .preventDefault(), чтобы button не обновлял страницу.

var input = document.querySelector(".input");
var btn = document.querySelector("button");
var body = document.querySelector("body");

btn.addEventListener('click', addParagraph);

function addParagraph(e) {
	e.preventDefault();
  var childELes = body.children;
  for (var p in childELes) {
    if (p.tagName === "p")
      p.remove();
  }
  if (input.value.trim() != "") {
    var newPara = document.createElement("p");
    newPara.innerText = input.value;
    body.appendChild(newPara);
  }
}
<!DOCTYPE html>
<html>
  <head>
    <title>test</title>
  </head>
  <body>
    <form>
      <p>
        <label>input:</label>
        <input type = "text" class = "input">
        <button>add</button>
      </p>
    </form>
  </body>
</html>
function addParagraph(e) {
  e.preventDefault();
  var a = document.getElementById("inserted-p");
  if (a != null) {a.remove();}
  if (input.value.trim() != "") {
    var newPara = document.createElement("p");
    newPara.id = "inserted-p";
    newPara.innerText = input.value;
    body.appendChild(newPara);
  }
}
  1. Ваша форма отправляется, поэтому предотвратите ее, позвонив e.preventDefault()

  2. Ваше удаление не работает, потому что p не является прямым потомком body, поэтому исправьте это, добавив id к вставленному элементу и удалив тег с помощью правильного селектора.

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