Элемент добавлен, но не отображается в nextElementSibling

У меня есть эта программа, которая может динамически создавать закрывающиеся элементы. Когда пользователь нажимает на созданный закрывающийся элемент, в его содержимом отображаются поле ввода и кнопка. Затем пользователь может ввести текст в текстовое поле, а затем нажать кнопку. Затем текст пользователей будет отображаться в выбранном закрывающемся контенте.

Все работает, отлично, за исключением случаев, когда я пытаюсь отобразить ввод пользователей в выбранном содержимом закрываемых элементов.

Вот что происходит:

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

Текст отображается только в закрывающемся содержимом после того, как я закрою выбранный закрывающийся:

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

Вот мой полный код:

var currentClosable;
var currentContent;
function selectedColl(){
 document.getElementById("inputTaskDiv").style.display = "block";
 currentClosable = event.target;
 currentContent = currentClosable.nextElementSibling;
  var inputTaskDiv = document.getElementById("inputTaskDiv");
  currentContent.append(inputTaskDiv);
}

var taskCounter = 0;
function addTask() {
  var text = document.getElementById("taskInput").value;
  // create a new div element and give it a unique id
  var newTask = $("<input type='checkbox'><label>"+ text + "</label><br>");
  newTask.id = 'temp' + taskCounter;
  taskCounter++
  // and give it some content
  var newContent = document.createTextNode(text);

  $(currentContent).append(newTask); //Why isn't it being displayed??
  console.info("appended");
}

var elementCounter = 0;
var elementCounterContent = 0;
var text;
function addElement() {
  text = document.getElementById("input").value;
  // create a new div element and give it a unique id
  
  var newDiv = $("<button class='collapsible' onclick='selectedColl()'></button>").text(text);
  var newContentOfDiv = $("<div class='content'></div>");


  newDiv.id = 'temp' + elementCounter;
  newContentOfDiv.id = 'content' + elementCounterContent;

  newDiv.classList = "div";
  elementCounter++
  elementCounterContent++
  // and give it some content
  var newContent = document.createTextNode(text);

  // add the newly created element and its content into the DOM

  document.getElementById("input").value = " ";
  $("body").append(newDiv, newContentOfDiv);

  newDiv.click(function() {
    this.classList.toggle("active");
    content = this.nextElementSibling;
    if (content.style.maxHeight){
      content.style.maxHeight = null;
    } else {
      content.style.maxHeight = content.scrollHeight + "px";
    }
  });
}
.collapsible {
  background-color: #777;
  color: white;
  cursor: pointer;
  padding: 18px;
  width: 100%;
  border: none;
  text-align: left;
  outline: none;
  font-size: 15px;
}

.active, .collapsible:hover {
  background-color: #555;
}

.collapsible:after {
  content: '\002B';
  color: white;
  font-weight: bold;
  float: right;
  margin-left: 5px;
}

.active:after {
  content: "\2212";
}

.content {
  padding: 0 18px;
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.2s ease-out;
  background-color: #f1f1f1;
}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
     <input id = "input" type = "text"><button onclick = "addElement()">Add</button>
     
   <div id = "inputTaskDiv" style = "display:none">
     <input id = "taskInput" type = "text"><button onclick = "addTask()">Add Task</button>
    </div>

У тебя проблема с css а не со скриптом! проблема с max-height. если вы опустите эту часть, она будет работать!

Dhaval Marthak 20.12.2020 06:57

Да, это действительно про CSS, overflow: hidden надо убрать

Saadi Toumi Fouad 20.12.2020 07:07

@DhavalMarthak Я попробовал оба ваших предложения, удаление max-height ничего не изменило для меня ... затем я также попытался удалить переполнение: скрыто, но когда я закрываю последний созданный закрывающийся элемент, содержимое не убирается вместе с закрывающимся ...

hp2345 20.12.2020 07:28

@SaymoinSam Я пытался удалить переполнение: скрыто, но когда я закрываю последний созданный закрывающийся элемент, содержимое не убирается вместе с закрывающимся

hp2345 20.12.2020 07:29

Несмотря на это, спасибо за вашу помощь, я постараюсь выяснить, как это работает с вашими предложениями!

hp2345 20.12.2020 07: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) для оценки ваших знаний,...
0
5
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Внесены изменения в CSS и JS.

В CSS вы можете увидеть, какие строки прокомментированы в стиле «.content»: max-height и overflow

Изменение в JS: Я изменился content.style.maxHeight с этим content.style.display

this.classList.toggle("active");
content = this.nextElementSibling;
if (content.style.display === 'block') {
    content.style.display = 'none';
} else {
    content.style.display = 'block';
}

Пример:

var currentClosable;
var currentContent;
function selectedColl() {
    document.getElementById("inputTaskDiv").style.display = "block";
    currentClosable = event.target;
    currentContent = currentClosable.nextElementSibling;
    var inputTaskDiv = document.getElementById("inputTaskDiv");
    currentContent.append(inputTaskDiv);
}

var taskCounter = 0;
function addTask() {
    var text = document.getElementById("taskInput").value;
    // create a new div element and give it a unique id
    var newTask = $("<input type='checkbox'><label>" + text + "</label><br>");
    newTask.id = 'temp' + taskCounter;
    taskCounter++
    // and give it some content
    var newContent = document.createTextNode(text);

    $(currentContent).append(newTask); //Why isn't it being displayed??
    console.info("appended");
}

var elementCounter = 0;
var elementCounterContent = 0;
var text;
function addElement() {
    text = document.getElementById("input").value;
    // create a new div element and give it a unique id

    var newDiv = $("<button class='collapsible' onclick='selectedColl()'></button>").text(text);
    var newContentOfDiv = $("<div class='content'></div>");


    newDiv.id = 'temp' + elementCounter;
    newContentOfDiv.id = 'content' + elementCounterContent;

    newDiv.classList = "div";
    elementCounter++
    elementCounterContent++
    // and give it some content
    var newContent = document.createTextNode(text);

    // add the newly created element and its content into the DOM

    document.getElementById("input").value = " ";
    $("body").append(newDiv, newContentOfDiv);

    newDiv.click(function () {
        this.classList.toggle("active");
        content = this.nextElementSibling;
        if (content.style.display === 'block') {
            content.style.display = 'none';
        } else {
            content.style.display = 'block';
        }
    });
}
.collapsible {
    background-color: #777;
    color: white;
    cursor: pointer;
    padding: 18px;
    width: 100%;
    border: none;
    text-align: left;
    outline: none;
    font-size: 15px;
}

.active,
.collapsible:hover {
    background-color: #555;
}

.collapsible:after {
    content: '\002B';
    color: white;
    font-weight: bold;
    float: right;
    margin-left: 5px;
}

.active:after {
    content: "\2212";
}

.content {
    padding: 0 18px;
    /* max-height: 0; */
    /* overflow: hidden; */
    transition: max-height 0.2s ease-out;
    background-color: #f1f1f1;
}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<input id = "input" type = "text"><button onclick = "addElement()">Add</button>

<div id = "inputTaskDiv" style = "display:none">
    <input id = "taskInput" type = "text"><button onclick = "addTask()">Add Task</button>
</div>

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