Подтвердить что ты не робот

Альтернатива для innerHTML?

Мне интересно, есть ли способ изменить текст всего в HTML без использования innerHTML.

Причина, о которой я прошу, заключается в том, что она нахмурилась W3C. Я знаю, что это ничто, но я просто хочу знать, есть ли способ?

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

Если у меня есть:

<div id="one">One</a>

innerHTML позволяет мне сделать это:

var text = document.getElementsById("one");
text.innerHTML = "Two";

И текст на моем экране изменится.
Я не хочу добавлять больше текста, я хочу изменить уже существующий текст.

4b9b3361

Ответ 1

Рекомендуемый способ - с помощью DOM-манипуляции, но он может быть довольно многословным. Например:

// <p>Hello, <b>World</b>!</p>
var para = document.createElement('p');
para.appendChild(document.createTextNode('Hello, '));

// <b>
var b = document.createElement('b');
b.appendChild(document.createTextNode('World');
para.appendChild(b);

para.appendChild(document.createTextNode('!'));

// Do something with the para element, add it to the document, etc.

ИЗМЕНИТЬ

В ответ на ваше редактирование, чтобы заменить текущий контент, вы просто удаляете существующий контент, а затем используйте приведенный выше код, чтобы заполнить новый контент. Например:

var someDiv = document.getElementById('someID');
var children = someDiv.childNodes;
for(var i = 0; i < children.length; i++)
    someDiv.removeChild(children[i]);

Но, как сказал кто-то другой, я бы рекомендовал вместо него использовать что-то вроде jQuery, поскольку не все браузеры полностью поддерживают DOM, а те, которые имеют причуды, которые рассматриваются внутри библиотеки JavaScript. Например, jQuery выглядит примерно так:

$('#someID').html("<p>Hello, <b>World</b>!</p>");

Ответ 2

Лучший способ сделать это - использовать document.createTextNode. Одной из основных причин использования этой функции вместо innerHTML является то, что все экранирование HTML-символов будет позаботиться о вас, тогда как вы должны были бы избежать своей строки самостоятельно, если бы вы просто устанавливали innerHTML.

Ответ 3

Вы можете получить тот же эффект, манипулируя DOM. Самый безопасный способ изменить текст - удалить все дочерние узлы элемента и заменить их новым текстом node.

var node = document.getElementById("one");

while( node.firstChild )
    node.removeChild( node.firstChild );
node.appendChild( document.createTextNode("Two") );

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

Причина, по которой большинство разработчиков избегает использования innerHTML, заключается в том, что доступ к элементам через DOM соответствует стандартам.

Ответ 4

Если вы хотите изменить простой текст, то есть более быстрое решение, основанное на стандартах:

document.getElementById("one").firstChild.data = "two";

В любом случае, обратите внимание, что innerHTML будет частью будущего стандарта HTML 5.

Ответ 5

Simple.

Замените text.innerHTML = 'two' на text.firstChild.nodeValue = 'two'.

Ответ 6

var who=document.getElementById('one'), txt='new text';
if(who.innerText) who.innerText=txt;
else if(who.textContent) who.textContent= txt;

Это может быть как нежелательно, как innerHTML для вас, но у него есть преимущество работы в некоторых случаях (IE), где innerHTML или appendChild нет, например, некоторые узлы таблицы, текст стиля и script элементы и значение полей формы

Ответ 7

Вы можете использовать DOM следующим образом:

<html>
<body>
<div>before</div>
<script type="text/javascript">
var element = document.getElementsByTagName("div")[0];
alert(element.firstChild.nodeValue);
element.removeChild(element.firstChild);
element.appendChild(document.createTextNode('after'));
alert(element.firstChild.nodeValue);
</script>
</body>

Но я думаю, что кто-то редко это делает, но использует фреймворк, например jQuery или Prototype или любой другой фреймворк javascript вне там. Это пример jquery:

<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script>
</head>
<body>
<div>before</div>
<script type="text/javascript">
var element = $("div");
alert(element.text());
element.text("after");
alert(element.text());
</script>
</body>

Ответ 8

Мне кажется, что комбинация CSS + HTML + JS должна достигать желаемых эффектов:

.myelement:before {   
    content: attr(alt);
} 

...

<span class='myelement' alt='initial value'></span> 

...

element.setAttribute('alt', 'new value'); 

Кто-нибудь знает, работает ли это на практике?

Ответ 9

Ну, я правильно понимаю ваш вопрос, это должен быть ответ.

var text = document.getElementById("one");
//text.innerHTML = "Two";
 text.childNodes[0].nodeValue="two";

Ответ 10

Также ищем хорошую альтернативу обхода element.innerHTML Наконец-то я нашел это решение:

HTMLElement.prototype.htmlContent = function(html)
{
    var dom = new DOMParser().parseFromString('<template>'+html+'</template>', 'text/html').head;
    this.appendChild(dom.firstElementChild.content);
}

//-- document.getElementById('my-id').innerHTML = string_of_html;
document.getElementById('my-id').htmlContent(string_of_html);

Другая альтернатива без <template> теги, но вместо этого:

HTMLElement.prototype.htmlContent = function(html)
{
    var dom = new DOMParser().parseFromString(html, 'text/html').body;
    while (dom.hasChildNodes()) this.appendChild(dom.firstChild);
}

Имейте в виду, что этот метод фактически "добавляет" содержимое, когда innerHTML "replace" content...

Это может помочь:

HTMLElement.prototype.clearContent = function()
{
    while (this.hasChildNodes()) this.removeChild(this.lastChild);
}

//-- document.getElementById('my-id').innerHTML = '';
document.getElementById('my-id').clearContent();

doc: https://github.com/swannty/escaping-innerHTML
perf: https://jsperf.com/escaping-innerhtml

Ответ 11

Иногда мне удобно хранить прямую ссылку на текст node, если я собираюсь регулярно его обновлять. Я делаю что-то вроде этого:

var dynamicText = myDiv.appendChild(document.createTextNode("the initial text"));

И тогда, когда мне нужно его обновить, я просто делаю это:

dynamicText.nodeValue = "the updated text";

Это предотвращает необходимость перемещения DOM или добавления или удаления любых детей.