2013-07-11 2 views
1

У меня есть следующий кодgetElementById возвращает объект, getElementsByName не возвращает ни

var commentId = 1834; 

alert("getElementsByName:: " + typeof(document.getElementsByName("tmp_airDiff" + commentId)[0])); 
alert("getElementById:: " + typeof(document.getElementById("tmp_airDiff" + commentId))); 

Там нет ни одного элемента, имеющего tmp_airDiff1834 как идентификатор или имя в документе.

Но вот что я получаю обратно:

getElementsByName:: undefined 
getElementById:: object 

Может кто-нибудь объяснить, почему getElementById возвращается object при использовании typeof, когда нет такого объекта в документе?

+0

Похоже, что у вас есть элемент с id = tmp_airDiff1834, но с этим именем нет. Это так? – techfoobar

+0

Абсолютно ничего не названо tmp_airDiff1834 на форме. – Robotron

+0

Если ничего подобного не названо так, почему вы ожидаете, что этот код вернет ничего, кроме неопределенного? – Jagi

ответ

10

Вы смущены, потому что

typeof null === "object" 

и getElementById возвращает null.

Да, это странно, точно так же, как typeof NaN === "number", но that's how it works.

enter image description here

В случае getElementsByName, вы выводите тип undefined, который является то, что вы получаете, когда вы получаете доступ к элементу из массива (или массив типа объекта, здесь).

[][1] === undefined 

Вы бы не почувствовали себя в этой ловушке с более адаптированной практикой отладки. Вместо того чтобы использовать

alert("some name : " + typeof(someValue)) 

вам лучше use the console of your browser:

console.log("some name :", someValue) 

Обратите внимание, что вы имели бы одинаковое поведение, если тестирование в if:

if (document.getElementsByName("tmp_airDiff" + commentId)[0]) { 
    // never goes there as undefined is falsy 
} 
if (document.getElementById("tmp_airDiff" + commentId)) { 
    // never goes there as null is falsy 
} 
+0

+1 для стола – Musa

+2

И вы заставили меня начать использовать другие вещи помимо Notepad ++ и предупреждения. Где эпическая кнопка ?! – Robotron

3

Причина в том, что document.getElementById() возвращает null, когда элемент с заданным ID не найден. И typeof(null) возвращает object.

3

Простые getElementById возвращает нулевое значение, если элемент не найдено и typeof null является объектом
getElementsByName возвращает коллекцию, если она пуста, любой индекс будет неопределенным. typeof undefined не определено.

1

Причина, по которой getElementsByName возвращается undefined, заключается в том, что она возвращает array, и вы ссылаетесь на индекс, который не существует. В качестве примера:

var array = []; 
array[2320]; //undefined 
array[0]; //undefined 

getElementById с другой стороны, возвращает null, когда элемент не был найден (он не возвращает пустой массив).

Смежные вопросы