2013-02-18 1 views
3

Я пытаюсь захватить текст из текстовой области HTML и вызвать метод create() при нажатии кнопки «Отправить». Метод пытается использовать сообщение из текстовой области и отправляет его в свой собственный тег p с классом и помещает отметку даты в свой собственный тег p и свой собственный класс.Как исправить «Uncaught TypeError: невозможно вызвать метод« appendChild »из null»

Они оба будут в комментариях div. Ошибка я получаю (с помощью инструментов разработчика в Chrome), является

Uncaught TypeError: Cannot call method 'appendChild' of null.

Это направлено на "cmt.appendChild (divTag);". Я очень новичок в Javascript, и это просто практика для меня, чтобы увеличить мои навыки. Вся помощь очень ценится!

var cmt = document.getElementById('comments'); 

function create() { 

    var username = 'User', 
     message = document.getElementById("textBox").value, 
     divTag = document.createElement('div'), 
     p1 = document.createElement('p'), 
     p2 = document.createElement('p'); 

    divTag.className = 'comment'; 

    p1.className = 'date'; 
    p1.innerHTML = new Date(); 
    divTag.appendChild(p1); 

    p2.className = 'message'; 
    p2.innerHTML = username + ': ' +message; 
    divTag.appendChild(p2); 

    cmt.appendChild(divTag); 
} 
+0

Вы уверены, что 'var cmt = document.getElementById ('comments');' вызывается после создания элемента идентификатора «комментарии»? – Dimitry

+0

Да, мой Javascript является внешним для моей HTML-страницы. – Fizzix

ответ

6

Ошибка, которую вы получаете, предполагает, что на вашей странице нет элементов с идентификаторами «комментарии». document.getElementById вернет null, когда элемент с таким ID не найден, и таким образом cmd.appendChild(divTag) будет выполнен как null.appendChild(divTag).

Если вы уверены, что этот элемент существует, вы можете выполнить свой JavaScript, который присваивает переменную cmt, прежде чем этот элемент будет создан браузером. Чтобы этого избежать, стандартная практика заключается в размещении тега <script>, который включает ваш внешний JavaScript непосредственно перед закрытием </body> тег.

Если вы по какой-то причине не можете поместить свой тег скрипта, попробуйте запустить код, который назначает переменную $(document).ready() (jQuery) or equivalent.

+0

Этот Javascript является внешним для моей HTML-страницы. У меня определенно есть div в моем HTML с идентификатором «комментариев».Хотя, div полностью пуст и ждет, когда этот текст будет помещен в него. – Fizzix

+0

Спасибо, добавлен мой код ПОСЛЕ того, как мой div был создан и отлично работал. Спасибо всем за вашу помощь, очень помог мне! :) – Fizzix

+0

+1, теперь я знаю, что еще может работать, если jQuery не вариант. Ницца. – Nope

1

Ваш код работает, если существуют необходимые элементы. Как вы можете видеть в this Fiddle.

Работает, если HTML похож на:

<div id="comments"> 
    <input id="textBox" type="textBox" value="Hello" /> 
</div> 

Я полагаю, что один из идентификаторов может быть опечатка или элемент, как вы ожидаете, что не существует.

Однако, если вы используете скрипт во внешнем файле, он может попытаться выполнить до того, как документ будет полностью загружен, поэтому ваш скрипт ссылается на элементы, а не , но готов к работе в DOM.

В jQuery вы бы обернули $(document).ready(function(){// your code here..}) вокруг.
Есть несколько подробностей о том, как это сделать только в JavaScript в этом сообщении SO: Documen Ready equivalent without jQuery.

+0

Это так странно, так как я также тестировал это, это Fiddle, и он отлично работал. У меня есть div с идентификатором «комментариев» в моем документе HTML. Мой документ HTML ссылается на мой документ Javascript в голове (очевидно), и мой div с идентификатором «комментариев» вызывается в конце моего документа HTML. Будет ли это иметь к этому какое-либо отношение? – Fizzix

+0

@JadeMulholland: Без jQuery я думаю, что это сложнее, как вы можете видеть на связанном примере. Пойдите в то, что [** x3ro **] (http://stackoverflow.com/users/124257/x3ro) предложил относительно тега '

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

  • Нет связанных вопросов^_^