У меня есть цикл for
, который создает некоторые элементы DOM с помощью функции. Цикл for успешно выполнялся несколько раз, но вдруг появлялась ошибка, и я не понимаю, почему.
Я добавил немного console.log
в свой код, чтобы помочь вам понять, я добавлю скриншот консоли в конце моего вопроса.
Итак, вот первая часть кода:
if(comments.length > 0) {
for(let k = 0; k < comments.length; k++) {
console.log('in the for 1')
createComment(commentContainer,comments[k])
console.log('in the for 2')
}
console.log('after the for') // We never reach this console.log
}
Тогда вот функция createComments()
:
let createComment = (container, data, answer = true) => {
console.log('Start createComment')
let newCommentPart = container.getElementsByTagName('textarea')[0]
let singleCommentContainer = createNodeBefore(container, newCommentPart, 'div', '')
if(answer === true){
let answeringContainer = createNode(singleCommentContainer, 'span', '')
let answeringButton = createNode(singleCommentContainer, 'span', `text random`)
if(data.answers && data.answers.length > 0) {
for(let i = 0; i < data.answers.length; i++) {
createComment(answeringContainer, data.answers[i], false)
}
}
let answerPostCommentInput = createNode(answeringContainer, 'textarea', '')
let answerPostCommentButton = createNode(answeringContainer, 'span', 'Some text')
}
console.log('End createComment')
}
И, наконец, это функции createNode()
и createNodeBefore()
, которые я использую для создания своих элементов:
let createNode = (parent, type, text, id = false, className = false, style = false) => {
console.log('createNode :' + type)
let textNode = document.createTextNode(text)
let element = document.createElement(type)
element.className = className ? className : "";
element.id = id ? id : "";
element.style = style ? style : "";
element.appendChild(textNode)
parent.appendChild(element)
console.log('Element :' + element)
return element
}
let createNodeBefore = (parent, node, type, text, id = false, className = false, style = false) => {
let textNode = document.createTextNode(text)
let element = document.createElement(type)
element.className = className ? className : ""
element.id = id ? id : ""
element.style = style ? style : ""
element.appendChild(textNode)
parent.insertBefore(element, node)
return element
}
Таким образом, функция многократно выполняется корректно, но почему-то перестает работать. Присмотревшись, я смог определить, что часть кода, которая не работает, является частью функции createComment()
:
let createComment = (container, data, answer = true) => {
console.log('Start createComment')
let newCommentPart = container.getElementsByTagName('textarea')[0]
console.log(newCommentPart)
console.log(container)
let singleCommentContainer = createNodeBefore(container, newCommentPart, 'div', '')
console.log('We never reach this part')
Еще одна действительно странная вещь: в функции createComment()
, если я заменю
let answerPostCommentInput = createNode(answeringContainer, 'textarea', '')
By
let answerPostCommentInput = createNode(answeringContainer, 'span', '')
все работает и у меня не было ни одной ошибки.
Не стесняйтесь спрашивать меня, если вам нужна дополнительная информация или что-то неясно.
ИЗМЕНИТЬ
В соответствии с просьбой я добавляю console.log аргументов функции createNode перед функцией, все выглядит нормально < img src="https://i.stack.imgur.com/ZPkIJ.png" alt="creatNodeBefore arguments">
textarea
элементы не имеют дочерних узлов. У них естьvalue
. - person Heretic Monkey   schedule 06.03.2019createNode()
иcreateNodeBefore()
для изменения значения вместо создания дочернего узла, если это текстовое поле, но у меня все еще есть та же ошибка. - person Nicolas J   schedule 06.03.2019createNodeBefore
из этой функции (то есть каждый изparent
,node
,type
,text
). Похоже, один из них не то, что вы думаете. - person Heretic Monkey   schedule 06.03.2019let answerPostCommentInput
вcreateComment()
. - person Barmar   schedule 06.03.2019catch(function(error) { console.log(error); });
. Начальный циклfor
вызывается в ответе на выборку, это ловушка этой выборки. - person Nicolas J   schedule 07.03.2019console.log(error + " on line " + error.lineNumber);
, чтобы вы могли видеть, где произошла фактическая ошибка. - person Barmar   schedule 07.03.2019NotFoundError: Node was not found on line 1
. Но у меня в строке 1 ничего нет, кроме моегоjQuery(function() {
. У вас есть идея, что может быть причиной этого? - person Nicolas J   schedule 07.03.2019