- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
let textarea = document.querySelector('textarea')
let list = document.querySelector('ol')
let newTask = document.createElement('li')
newTask.innerText = textarea.value
function submitTask() {
list.appendChild(newTask)
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+1
let textarea = document.querySelector('textarea')
let list = document.querySelector('ol')
let newTask = document.createElement('li')
newTask.innerText = textarea.value
function submitTask() {
list.appendChild(newTask)
}
При попытке добавлять новый HTML элемент функция добавления срабатывает только один раз, к тому же для добавления используется не то значение которое я ввожу в текстовое поле, а только дефолтное. Так как я перепробовал уже массу вариантов и с инпутом, и с событием нажатия Enter, какие-то варианты, которые уже забыл, я подозреваю, что проблема, вероятно, в appendChild, но не уверен, и не понимаю её.
Kozel 22.10.2021 10:02 # +5
> If the given child is a reference to an existing node in the document, appendChild() moves it from its current position to the new position
appendChild честно отрабатывает каждый раз, а вот код, находящийся вне функции - только один раз, и не тогда, когда хочется пользователю в соответствии с его представлениями о чудесах и магии, а когда интерпретатор до него дойдёт.
Итак, смотрим, что делает приведённый код при его запуске (не раньше и не позже) (*):
1) Определяет функцию submitTask, при вызове которой (не раньше и не позже) у объекта в переменной list вызовется метод appendChild со значением переменной newTask в качестве аргумента. Почему этот пункт идёт первым в списке, хотя функция определяется в конце кода? Потому что это JavaScript, идите нахер с такими вопросами.
2) Ищет первый попавшийся элемент по селектору 'textarea' и запоминает его в переменной textarea.
3) Ищет первый попавшийся элемент по селектору 'ol' и запоминает его в переменной list.
4) Создаёт элемент типа 'li' и запоминает его в переменной newTask. Ключевой момент: см. (*)
5) Берёт текст, написанный в textarea, и вписывает его во внутренности newTask. Ключевой момент: см. (*)
Ну а когда-нибудь потом мы вызываем функцию submitTask, которая помещает когда-то давно созданный элемент, хранящийся в newTask, внутрь когда-то давно найденного элемента, хранящегося в list.
shuric 22.10.2021 10:27 # 0
bormand 22.10.2021 10:30 # +1
Ну и искать элементы по id, а не по типу. Иначе всё сломается если добавить ещё одно поле ввода или список.
shuric 22.10.2021 10:37 # +1
Soul_re@ver 22.10.2021 10:50 # +2
bormand 22.10.2021 11:06 # +2
Kozel 22.10.2021 11:17 # +3
Здесь при вызове print() выпишется текст в зависимости от того, какая функция была вызвана последней перед этим.
Проблема изначального кода была в том, что все сохранения, создания и заполнения текстом происходили в самом начале, а при вызове функции - только втыкание одного элемента в другой.
Если есть уверенность, что конкретные элементы, хранящиеся в textarea и list, всегда будут в документе - достаточно внести в функцию создание и заполнение <li>. Если нет - нужно вносить всё.
И да, если есть планы работать над более-менее сложными проектами, эту тему (какой код когда выполняется) нужно освоить максимально надёжно. Наверное, любой серьёзный код на JavaScript - это "едет функция через функцию".
shuric 22.10.2021 10:39 # +1
ObeseYoung 22.10.2021 14:01 # 0
А с var заработало бы сразу!