2010-05-24 4 views
9

, что разница междуAppendChild + createElement

var div = document.createElement('div');//output -> [object HTMLDivElement] 

document.getElementById('container').appendChild(div); 

и

var div = '<div></div>'; 

document.getElementById('container').appendChild(div);//output -> <div></div> 

не должны и быть такими же? а если нет, то как мне получить 2-ю версию?

ответ

17

Позже это чистый html для элемента, в то время как первый объект. Для первого вам понадобится appendChild, а для более поздних - innerHTML.

не должны быть одинаковыми? и если нет, как мне получить 2-ю версию до ?

var div = '<div></div>'; 
document.getElementById('container').innerHTML = div; 
+6

, если вы довольны ответом, вы должны отметить его как принятый. обратите внимание, что '+ =' - это оператор, который ближе всего приближает поведение 'append', а не' = '. –

+0

«Позднее - чистый html ...». Это просто строка. – Yay295

2

AppendChild ожидает элемент так, когда вы отправить его текст, он не знает, что делать. Возможно, вы захотите изучить библиотеку javascript, чтобы облегчить часть этой работы, например jQuery. Ваш код будет:

$('#container').append('<div></div>'); 
+2

Там _so_ должно быть «удержаться, 2 других человека набирают ответы прямо сейчас» при вводе ответа, lol –

+0

, в то время как я думаю, что накладные расходы будут включать jquery * only * для этого, все равно можно утверждать что * если * OP уже использовал jQuery, это могло бы быть самым близким к тому, что требовалось OP, поэтому я считаю, что это достойная альтернатива, которая не должна быть потеряна только потому, что кто-то еще предложил решение. –

3

appendChild действительно ожидает HTMLDomNode определенного типа, например, HTMLDivElement, а не строка. Он не знает, как обращаться со строкой. Вы могли бы сделать

document.getElementById('container').innerHTML += div; 

но я действительно предпочитаю первую версию; и я бы больше полагался на него, чтобы вести себя одинаково во всех браузерах.

+0

Есть ли недостатки в этом методе? Как обычно я это достигаю. – SwankyLegg

+0

это не является предпочтительным, поскольку это удаляет прослушиватели событий, а также состояние предыдущих элементов. – Kurkula

5

С помощью вашего JS/DOM-двигателя, вызывающего Element.appendChild с string в качестве аргумента, создается новый узел Text, который будет создан, а затем добавлен.

Ваш первый пример создает элемент <div>. Второй пример создает текстовый узел с <div></div> в качестве его содержимого.

Ваш второй пример эквивалентен:

var div = '<div></div>'; 

document.getElementById('container').appendChild(document.createTextNode(div));//output -> <div></div> 

Как Sarfraz Ahmed mentioned in his answer, вы можете сделать второй пример работы, как вы хотите работать, написав:

var div = '<div></div>'; 

document.getElementById('container').innerHTML = div; 
+0

действительно ли существует какой-либо браузер, в котором передача строкового аргумента вызывает создание и добавление нового текстового узла? в firefox и chrome это просто вызывает исключение из-за незаконных аргументов, и ничего не добавляется: http://jsbin.com/omofo3/edit –

+0

@David Hedlund, я объяснял поведение, которое плакат испытывал. Я не тестировал никаких браузеров (вероятно, должен был). Ты прав; это, по-видимому, исключительный случай. – strager

1

Самое простое решение и поддерживать все браузеры:

var div = '<div></div>'; 
var parser = new DOMParser(); 
var myDiv = parser.parseFromString(html, "text/xml"); 

Другое решение может быть:

var div = '<div></div>'; 
var tmpDiv = document.createElement('div'); 
    tmpDiv.innerHTML = div; 

    elDiv = tmpDiv.childNodes[0]; //Now it can be used as an element 
0

Вы также можете использовать их для добавления/добавьте в начале элемента в DOM соответственно:

var elem = document.documentElement.appendChild(document.createElement(element)); 
var elem = document.documentElement.prepend(document.createElement(element)); 

и использовать переменную elem целевой элемент (например):

elem.style.display = "block"; 
elem.style.remove(); 
elem.style.id = ...; 

и т.п.

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