Как добавить отдельные элементы в список в javaScript?

Я пытаюсь создать для пользователя возможность создать список принадлежащих ему записей. Однако я столкнулся со следующей проблемой:

  1. Когда пользователь пытается создать список без имени, в список добавляется пустой / невидимый элемент. Мне нужен код, чтобы попросить пользователя ввести имя, если он оставит приглашение пустым.
  2. Когда добавляются элементы, я хочу, чтобы они были отдельными и разными элементами. Теперь они отображаются и отображаются как одно целое.

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

Мой нынешний код представлен ниже:

function myFunction1() {
  var txt;
  var person = prompt("Please enter the name of your record list:");
  if (person == null || person == "") {
    txt = "";
  } else {
    txt = person + "<br>";
  }
  document.getElementById("myRecords").innerHTML += txt;
}
<a id = "myRecords"></a>
<a id = "create" onclick = "myFunction1()">Create RecordList</a>
Поведение ключевого слова "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
0
115
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

вам нужно изменить свой JS на следующее:

function myFunction1() {
  var txt;
  var person = prompt("Please enter the name of your record list:");
  if (person == "") {
      alert('Please enter a name');
      return;
  } else if (person == null){
      return;
  } else {
      txt =  person;
  }
  var span = document.createElement('span');
  span.setAttribute('class', 'myElement');
  span.innerHTML = txt;
  
  document.getElementById("myRecords").appendChild(span);
}
<a id = "myRecords"></a>
<a id = "create" onclick = "myFunction1()">Create RecordList</a>

С помощью createElement создается новый элемент, чтобы добавить класс, вы можете использовать setAttribute, а затем добавить его в качестве дочернего элемента к своему элементу myRecords через appendChild.

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

Вы должны использовать что-то вроде (не) упорядоченного списка (<ol>, <ul>), а затем при необходимости добавить элемент списка (<li>), содержащий имя, в теге <a>. Если вы хотите добавить пустой элемент, когда имя не введено, вам не нужно использовать оператор if.

const getRecordList = () => document.getElementById('recordList');
const getCreateButton = () => document.getElementById('create');

function promptInput(value = '') {
  const message = 'Please enter the name of your record list:';
  let name = '';
  while (name === '') {
    name = prompt(message, value);
  }
  return name;
}

function createListItem(name) {
  const listItem = document.createElement('li');
  listItem.innerHTML = `<a onclick = "updateRecord(this)">${name}</a>`;
  return listItem;
}

function createRecord() {
  const name = promptInput();
  if (!name) return;
  getRecordList().appendChild(createListItem(name || ''));
}

function updateRecord(li) {
  li.innerHTML = promptInput(li.innerHTML);
}
<h2>Record List</h2>
<ol id = "recordList"></ol><hr>
<button id = "create" onclick = "createRecord()">Create</button>

Спасибо за совет! Если возможно, я хочу сохранить элемент как <a>. Кажется, это невозможно с этим решением. Мне что-то не хватает?

egx 13.11.2018 15:29

Конечно, я создал новую функцию, которая создает элемент списка с тегом <a>, заключающим имя.

Callam 13.11.2018 19:00

Не зная точно, чего вы пытаетесь достичь, вот решение, которое я для вас придумал:

function myFunction(prompt_text) {
  var txt;
  var list;
  var person;
  if (prompt_text != '' && prompt_text != undefined) {
    person = prompt(prompt_text);
  } else {
    person = prompt("Please enter the name of your record list:");
  }
  if (person == null || person == "") {
    txt = "";
  } else {
    txt = '<li>' + person + "</li>";
  }
  if (txt != '') {
    document.getElementById("myRecords").innerHTML += txt;
  } else if (person != null){
    myFunction("Names cannot be blank, please enter the name of your record list:");
  } else {
    return;
  }
}
<ul id = "myRecords"></ul>
<a id = "create" onclick = "myFunction()">Create RecordList</a>

Я изменил контейнер, в который вы помещаете данные, в неупорядоченный список <ul></ul>, чтобы облегчить создание в нем нескольких записей, и автоматически добавил DOM <li></li>, чтобы список выполнял всю работу за вас.

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

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

Последнее изменение - это упомянутый выше рекурсивный вызов функции. Если переменная txt пуста, функция вызывает себя с новым prompt_text, что позволяет вам сообщить пользователю, ПОЧЕМУ он сделал это неправильно, а также дает ему еще одну возможность исправить это.

function myFunction1() {
  let person = prompt("Please enter the name of your record list:");
  if (person) {
    let div = document.createElement('div');
    div.innerText=person;
    document.getElementById("myRecords").appendChild(div);
  }else{
    alert('Please enter a name');
  }
}
<a id = "myRecords"></a>
<a id = "create" onclick = "myFunction1()">Create RecordList</a>

Вы можете createElement и appendChild добавить нужные элементы.

Спасибо! Это решение тоже сработало. Проблема заключалась в создании элемента и добавлении к нему. Спасибо за совет :-)

egx 13.11.2018 15:27

При использовании prompt лучше всего использовать петлю while, чтобы убедиться, что ввод введен. Это будет продолжать цикл сообщения, пока пользователь не введет достаточную информацию. Когда пользователь нажимает cancel, возвращается нулевое значение. В цикле while мы проверяем, является ли person нулевым, и если это так, мы немедленно возвращаемся.

Чтобы добавить отдельные элементы, вы можете использовать document.createElement, а затем добавить этот элемент к выбранному родительскому элементу с помощью метода appendChild.

В приведенном ниже коде я взял на себя смелость преобразовать ваш div myRecords в ul или тег неупорядоченного списка. При вводе имен они добавляются как дочерние элементы li (элемент списка) к этому тегу.

function myFunction1() {
  var person, ul = document.getElementById("myRecords"), li = document.createElement("li");
  while (!person) {
    person = prompt("Please enter the name of your record list:");
    if (person == null) return;
  }
  li.textContent = person;
  ul.appendChild(li);
}
myFunction1();
myFunction1();
<ul id = "myRecords"></ul>

Если вы не хотите использовать список, вы можете просто обновить разметку и изменить то, что вы добавляете. Ниже myRecords - это тег a. Мы добавляем div с соответствующим текстом к этому тегу привязки, как делали выше.

function myFunction1() {
  var person, a = document.getElementById("myRecords"), div = document.createElement("div");
  while (!person) {
    person = prompt("Please enter the name of your record list:");
    if (person == null) return;
  }
  div.textContent = person;
  a.appendChild(div);
}
myFunction1();
<a id = "myRecords" href = "#"></a>

Спасибо за подсказку - у меня это сработало. Если возможно, я предпочитаю иметь элемент с id = "myRecords" как <a>. Если я изменю элемент обратно на <a>, это решение, похоже, не сработает.

egx 13.11.2018 15:24

@ tobiasmadsen17 Что ж, это не будет работать с дочерними элементами li, если вы измените ul на a, поскольку единственный элемент, у которого могут быть дочерние элементы li, - это ul/ol. Затем выполните li = document.createElement("div"), и он будет работать (и вы можете изменить имя переменной Ли на div).

Asons 13.11.2018 16:10

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