Как заменить текст внутри элемента div?

Мне нужно динамически установить текст в элементе DIV. Каков наилучший подход, безопасный для браузера? У меня есть prototypejs и scriptaculous.

<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 23.09.2008 20:13

Можно ли это использовать в атаке с использованием XSS-инъекции?

James Westgate 04.05.2012 15:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
175
2
545 691
14
Перейти к ответу Данный вопрос помечен как решенный

Ответы 14

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

Одна из замечательных особенностей Prototype заключается в том, что $('field_name') делает то же самое, что и document.getElementById('field_name'). Используй это! :-)

Ответ Джона Топли с использованием функции Prototype update - еще одно хорошее решение.

Это не похоже на JavaScript?

Milan Babuškov 23.09.2008 19:42

Не используйте innerHTML. Это не рекомендация w3c и ведет себя непоследовательно. Это считается плохим стилем.

Tom 23.09.2008 19:54

Том, что следует использовать вместо этого (если вы не используете Prototype)?

Milan Babuškov 23.09.2008 20:19

Милан, более приемлемый способ - пройти через childNodes, вызвать removeNode (true) для каждого, а затем добавить новые узлы, созданные с помощью document.createElement () или document.createTextNode (). Если вам нужно это сделать, я бы порекомендовал написать функцию, чтобы не печатать слишком много.

Joel Anair 24.09.2008 19:13

вы забыли #. на самом деле это $ ('# field_name')

Radu Simionescu 15.10.2012 03:56

@RaduSimionescu Нет, это не так. Этот вопрос и ответ касается Prototype.js, а не jQuery. В Prototype $ ищет элемент по идентификатору. Он не основан на селекторах, как jQuery. api.prototypejs.org/dom/dollar

ceejayoz 15.10.2012 06:11

Вы можете просто использовать:

fieldNameElement.innerHTML = "My new text!";

Не следует ли использовать одинарные кавычки для «статического» текста?

Milan Babuškov 23.09.2008 19:45

В PHP - да. Я не верю, что в JavaScript это имеет значение.

ceejayoz 23.09.2008 19:45

В Javascript одинарные и двойные кавычки взаимозаменяемы.

17 of 26 23.09.2008 19:49

плохой совет, потому что текст может случайно содержать содержимое, похожее на HTML-разметку

Trident D'Gao 11.09.2014 21:34

element.innerHTML = "<script>doSomethingMalicious()</script>"; не будет хорошей идеей. element.innerHTML = "& neither will this";

Joseph Nields 16.09.2016 01:21

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

if (fieldNameElement)
    fieldNameElement.innerHTML = 'some HTML';
Ответ принят как подходящий

Я бы использовал метод update от Prototype, который поддерживает простой текст, фрагмент HTML или любой объект JavaScript, определяющий метод toString.

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

@Aeyoun OP подразумевает, что они уже использовали Prototype, поэтому в этом случае имеет смысл воспользоваться им.

John Topley 08.04.2013 11:35

Почему у меня работает только с $("field_name").text("new text");

Drako 15.12.2015 17:17

@Drako Вы используете PrototypeJS?

John Topley 15.12.2015 18:22

@Drako Исходный вопрос и мой ответ семилетней давности относятся к PrototypeJS, а не jQuery.

John Topley 16.12.2015 13:00

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

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

Лучше заменить узел, чем удалить его и добавить новый в виде двух отдельных операций.

Quentin 23.09.2008 20:01

Быстрый ответ - использовать innerHTML (или метод обновления прототипа, что почти то же самое). Проблема с innerHTML заключается в том, что вам нужно избегать назначаемого содержимого. В зависимости от ваших целей вам нужно будет сделать это с другим кодом ИЛИ

в IE: -

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

в FF: -

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 в исходном виде.


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, поэтому метод переносим на другие языки и не полагается на нестандартный innerHTML.
  2. fieldName может содержать HTML, что может быть попыткой XSS-атаки. Если мы знаем, что это просто текст, мы должны создать текстовый узел вместо того, чтобы браузер анализировал его на предмет HTML.

Если бы я собирался использовать библиотеку javascript, я бы использовал jQuery и сделал бы следующее:


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

Обратите внимание, что Комментарий @AnthonyWJones верен: «field_name» не является особенно описательным идентификатором или именем переменной.

На какие другие языки вы могли бы перенести эту технику?

John Topley 23.09.2008 19:54

Любой язык с реализацией DOM поддерживает это (и большинство языков имеют реализацию DOM).

Quentin 23.09.2008 20:01

Это хороший ответ, лучше моего, и это правильный ответ. Тем не менее, вы можете подумать о приведении примера в порядок. "fieldname" - не лучшее название для параметра функции. На самом деле, может быть лучше взять два: один для идентификатора элемента, а другой - для содержимого, т. Е. elemID, содержание

AnthonyWJones 23.09.2008 20:07

Я позаимствовал fieldName и идентификатор из самого вопроса.

Daniel Papasian 23.09.2008 21:00

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

John Topley 23.09.2008 21:13

Обратите внимание, что textContent обеспечивает то же самое, innerHTML теперь является стандартом, и вы можете использовать document вместо fieldNameElement.ownerDocument.

Oriol 02.04.2016 18:11

Если вы склонны использовать на своем сайте много JavaScript, jQuery делает игру с DOM чрезвычайно простой.

http://docs.jquery.com/Manipulation

Делает это так просто, как: $ ("# field-name"). text ("Новый текст.");

У Prototype похожие полезные функции.

ceejayoz 23.09.2008 19:54

Вот простой способ jQuery:

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

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

Это кажется плохой идеей - что, если ваш элемент содержит подузлы с таким же текстом или ваш текст соответствует части имени тега элемента? Почему не использовать просто .text?

James Westgate 04.05.2012 15:13

Я полностью согласен с Джеймсом Вестгейтом, не стоит этого делать.

TGarrett 08.10.2015 15:17

nodeValue также является стандартным свойством DOM, которое вы можете использовать:

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

el.innerHTML='';
el.appendChild(document.createTextNode("yo"));

Обновлено для всех, кто читает это в 2013 году и позже:

В этом ответе много SEO, но все ответы сильно устарели и зависят от библиотек, которые делают то, что все текущие браузеры делают из коробки.

Чтобы заменить текст внутри элемента div, используйте Node.textContent, который предоставляется во всех текущих браузерах.

fieldNameElement.textContent = "New text";

@Legolas Поэтому два года назад мы написали «текущий браузер».

mikemaccana 07.05.2015 18:25

Спасибо! Я пробовал другие ответы, задаваясь вопросом, почему «innerHTML» не работает.

GreySage 06.02.2017 21:06

Вы можете подумать о том, почему textContent превосходит innerHTML: он быстрее, безопаснее и уместнее, когда вы не пытаетесь намеренно вставить разметку HTML.

CertainPerformance 16.04.2019 03:00

Используйте innerText, если вы не можете предполагать структуру - Используйте данные Text # для обновления существующего текста Тест производительности

В HTML поместите это

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

В Javascript поместите это

var fieldNameElement = document.getElementById('field_name');
        if (fieldNameElement)
        {fieldNameElement.innerHTML = 'some HTML';}

Другие вопросы по теме