Як замінити текст усередині елемента div?


166

Мені потрібно динамічно встановити текст всередині елемента DIV. Який найкращий підхід для браузера? У мене є прототипи та сценарії.

<div id="panel">
  <div id="field_name">TEXT GOES HERE</div>
</div>

Ось як буде виглядати функція:

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById('field_name');
  //Make replacement here
}

Чи прийнята відповідь робить те, що ви хочете, коли призначений такий текст: - <span style = "font-size: 36pt"> Це великий </span>. Якщо така поведінка є бажаною, то чи можете ви переформулювати відповідне запитання?
AnthonyWJones

Чи можна це використовувати при нападі ін'єкції XSS?
Джеймс Вестгейт

Відповіді:


49

Я б використовував updateметод Prototype, який підтримує звичайний текст, фрагмент HTML або будь-який об’єкт JavaScript, який визначає toStringметод.

$("field_name").update("New text");

26
@Aeyoun ОП означало, що вони вже використовують прототип, тому, якщо це так, має сенс скористатися цим.
Джон Топлі

6
Чому зі мною тільки працює$("field_name").text("new text");
Драко

@Drako Чи використовуєте Ви PrototypeJS?
Джон Топлі

10
@Drako Оригінальне запитання та моя відповідь від семи років тому стосуються PrototypeJS, а не jQuery.
Джон Топлі

255

Ви можете просто використовувати:

fieldNameElement.innerHTML = "My new text!";

2
Чи не слід використовувати окремі лапки для "статичного" тексту?
Мілан Бабушков

5
У PHP так. У JavaScript я не вважаю, що це має значення.
ceejayoz

46
У Javascript одинарні та подвійні лапки взаємозамінні.
17 з 26

18
погана порада, тому що текст може випадково містити вміст, що нагадує HTML-розмітку
Trident D'Gao

10
element.innerHTML = "<script>doSomethingMalicious()</script>";не буде гарною ідеєю. element.innerHTML = "& neither will this";
Джозеф Нілдс

175

Оновлено для всіх, хто читає це у 2013 році та пізніше:

У цій відповіді багато SEO, але всі відповіді сильно застаріли і залежать від бібліотек, щоб робити те, що всі поточні браузери роблять поза коробкою.

Щоб замінити текст всередині елемента div, використовуйте Node.textContent, який надається у всіх поточних браузерах.

fieldNameElement.textContent = "New text";

10
@Legolas Тому два роки тому писав "поточний браузер".
mikemaccana

2
Дякую! Я пробував інші відповіді, цікавившись, чому "innerHTML" не працює.
GreySage

2
Ви можете розглянути питання про те, чому textContentце чудовий метод innerHTML: він швидший, безпечніший і доцільніше, коли навмисне не намагаєтеся вставити розмітку HTML.
Певневиконання

75

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById("field_name");
  while(fieldNameElement.childNodes.length >= 1) {
    fieldNameElement.removeChild(fieldNameElement.firstChild);
  }
  fieldNameElement.appendChild(fieldNameElement.ownerDocument.createTextNode(fieldName));
}

Переваги робити це таким чином:

  1. Він використовує лише DOM, тому техніка є портативною для інших мов, і не покладається на нестандартний внутрішній HTMLML
  2. fieldName може містити HTML, який може бути спробою атаки XSS. Якщо ми знаємо, що це лише текст, нам слід створити текстовий вузол, а не браузер розбирати його на HTML

Якби я збирався використовувати бібліотеку javascript, я б використовував jQuery, і роби це так:


  $("div#field_name").text(fieldName);

Зауважте, що коментар @AnthonyWJones правильний: "ім'я_поля" не є особливо описовим ідентифікатором або ім'ям змінної.


На яких інших мовах ви могли б перенести цю техніку?
Джон Топлі

Будь-яка мова з реалізацією DOM підтримує це (і більшість мов мають реалізацію DOM).
Квентін

Це хороша відповідь, краща за мою і є правильною відповіддю. Ви можете поглянути на приклад приклад. 'ім'я поля' не є гарним іменем для параметра функції. Насправді, найкраще взяти два для ідентифікатора елемента та іншого для вмісту, тобто; elemID, content
AnthonyWJones

Я запозичив fieldName та ID з самого запитання.
Даніель Папасян

Питання, ймовірно, використовувало ім'я field_name, щоб зробити приклад загальним. Також запитуючий зазначає, що прототип доступний, але не jQuery.
Джон Топлі

17
$('field_name').innerHTML = 'Your text.';

Однією з чудових особливостей Prototype є те, що $('field_name')робить те саме, що іdocument.getElementById('field_name') . Використай це! :-)

Відповідь Джона Топлі за допомогою updateфункції прототипу - ще одне хороше рішення.


4
Це не схоже на JavaScript?
Мілан Бабушков

1
Не використовуйте innerHTML. Це не рекомендація w3c і поводиться непослідовно. Це вважається поганим стилем.
Том,

Томе, що слід використовувати замість цього (якщо ти не використовуєш прототип)?
Мілан Бабушков

1
Мілан, більш прийнятним способом є прокручування дочірніх вузлів, виклик RemoveNode (true) на кожному, а потім додавання нових вузлів, створених за допомогою document.createElement () або document.createTextNode (). Якщо вам потрібно це зробити, я рекомендую написати функцію, щоб уникнути багато набору тексту.
Джоель Анаір

3
@RaduSimionescu Ні, це не так. Це питання та відповідь стосується Prototype.js, а не jQuery. У прототипі $шукається елемент за ідентифікатором. Це не на основі селекторів, як у jQuery. api.prototypejs.org/dom/dollar
ceejayoz

15

Швидка відповідь полягає у використанні innerHTML (або методі оновлення прототипу, який майже те саме). Проблема з InternalHTML полягає в тому, що вам потрібно уникати призначеного контенту. Залежно від цілей, вам потрібно буде це зробити з іншим кодом АБО

в IE: -

document.getElementById("field_name").innerText = newText;

у ФФ: -

document.getElementById("field_name").textContent = newText;

(Насправді FF мають у коді таке подання)

HTMLElement.prototype.__defineGetter__("innerText", function () { return this.textContent; })

HTMLElement.prototype.__defineSetter__("innerText", function (inputText) { this.textContent = inputText; })

Тепер я можу просто використовувати innerText, якщо вам потрібна максимально широка підтримка браузера, то це не повне рішення, але жодне з них не використовує innerHTML в сирому вигляді.


7

Якщо ви дійсно хочете, щоб ми просто продовжували там, де ви зупинилися, ви можете зробити:

if (fieldNameElement)
    fieldNameElement.innerHTML = 'some HTML';

5

nodeValue також є стандартною властивістю DOM, яку ви можете використовувати:

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById(field_name);
  if(fieldNameElement.firstChild)
    fieldNameElement.firstChild.nodeValue = "New Text";
}


1

Якщо ви схильні почати використовувати багато JavaScript на своєму сайті, jQuery робить гру з DOM надзвичайно простою.

http://docs.jquery.com/Manipulation

Робить це таким же простим, як: $ ("# ім'я поля"). Текст ("Якийсь новий текст.");


Прототип має подібні функції корисності.
ceejayoz


0
function showPanel(fieldName) {
  var fieldNameElement = document.getElementById(field_name);

  fieldNameElement.removeChild(fieldNameElement.firstChild);
  var newText = document.createTextNode("New Text");
  fieldNameElement.appendChild(newText);
}

Краще замінити вузол, потім видалити його і додати новий у вигляді двох окремих операцій.
Квентін

0

Ось простий спосіб jQuery :

var el = $('#yourid .yourclass');

el.html(el.html().replace(/Old Text/ig, "New Text"));

Це здається поганою ідеєю - що робити, якщо ваш елемент містив підрозділи з тим самим текстом, або ваш текст відповідає частині імені тега елемента? Чому не просто використовувати .text?
Джеймс Вестгейт

Я повністю згоден з Джеймсом Вестгейтом, не повинен цього робити.
TGarrett

0

У HTML покладіть це

<div id="field_name">TEXT GOES HERE</div>

У Javascript помістіть це

var fieldNameElement = document.getElementById('field_name');
        if (fieldNameElement)
        {fieldNameElement.innerHTML = 'some HTML';}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.