Неперехваченная ошибка типа: Не удается прочитать свойства null (чтение «дочерних») в окне.при загрузке

#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.