#javascript #html #frontend
Вопрос:
Я пытаюсь получить детей от div, однако по какой-то причине это не сработает.
Я получаю div с помощью метода getElementById, а затем, когда я пытаюсь получить дочерние элементы этого элемента, он не распознает его и выдает мне ошибку
window.onload = function(){
console.log("h")
for (i in bookData ){
var current = bookData[i]
var currentCodeN = current.codeName
var currentHTMLElem = document.getElementById(toString(currentCodeN))
console.log(typeof(currentHTMLElem)) //returns 'object'
console.log(typeof(currentHTMLElem.children)); //error
console.log(currentHTMLElem.children.length);
}
}
Есть идеи, почему это происходит? Поискал эту проблему и настроил событие для ожидания загрузки всей страницы. Все еще не работает
Ошибка:
Uncaught TypeError: Cannot read properties of null (reading 'children')
at window.onload"
Я не использую iFrame
ОБНОВЛЕНИЕ: Я использовал toString для уже существующей строки. Извините.
Комментарии:
1.
typeof(null)
возвращает «объект»
Ответ №1:
Здесь происходит несколько вещей.
var currentHTMLElem = document.getElementById(toString(currentCodeN))
Это делает Currenttmlelem null
. Вернемся к вопросу «почему», но он явно равен нулю, потому что в сообщении об ошибке указано, что это так.
console.log(typeof(currentHTMLElem)) //returns 'object'
Да, если currentHTMLElem равен нулю, typeof
вернется "object"
. Итак, вот ты где.
Я не знаю, что bookData
это такое, но я уверен, что использование toString
неверно. Посмотрите, что toString
делает для различных объектов:
toString(null)
-> "[object Undefined]"
toString(12)
-> "[object Undefined]"
toString(anythingatall)
-> "[object Undefined]"
Это потому, что вы называете неправильным toString
. Вызов toString
без объекта будет использовать базу Object.prototype.toString
с неопределенным объектом. Если вы вызовете его с помощью такого объекта, как toString.apply(12)
вы, вы получите базовую версию, которая просто сообщит вам тип ( [Object Number]
). Вместо этого вы хотели бы вызвать перегруженную версию: currentCodeN.toString()
, которая будет вызывать toString для любого типа currentCodeN
. Для строки это просто возвращает строку, для числа она вернет версию строки.
Однако это вызовет ошибку is currentCodeN
равно нулю или не определено. Вам вообще не нужно будет использовать toString
. Я предполагаю, что это уже строка, так что попробуйте просто:
var currentHTMLElem = document.getElementById(current.codeName)
или для максимальной безопасности:
var currentHTMLElem = document.getElementById(current amp;amp; current.codeName || '')
если это все еще дает вам null
, то элемент не существует в DOM.