Мне нужно динамически установить текст в элементе 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
}
Можно ли это использовать в атаке с использованием XSS-инъекции?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


$('field_name').innerHTML = 'Your text.';
Одна из замечательных особенностей Prototype заключается в том, что $('field_name') делает то же самое, что и document.getElementById('field_name'). Используй это! :-)
Ответ Джона Топли с использованием функции Prototype update - еще одно хорошее решение.
Это не похоже на JavaScript?
Не используйте innerHTML. Это не рекомендация w3c и ведет себя непоследовательно. Это считается плохим стилем.
Том, что следует использовать вместо этого (если вы не используете Prototype)?
Милан, более приемлемый способ - пройти через childNodes, вызвать removeNode (true) для каждого, а затем добавить новые узлы, созданные с помощью document.createElement () или document.createTextNode (). Если вам нужно это сделать, я бы порекомендовал написать функцию, чтобы не печатать слишком много.
вы забыли #. на самом деле это $ ('# field_name')
@RaduSimionescu Нет, это не так. Этот вопрос и ответ касается Prototype.js, а не jQuery. В Prototype $ ищет элемент по идентификатору. Он не основан на селекторах, как jQuery. api.prototypejs.org/dom/dollar
Вы можете просто использовать:
fieldNameElement.innerHTML = "My new text!";
Не следует ли использовать одинарные кавычки для «статического» текста?
В PHP - да. Я не верю, что в JavaScript это имеет значение.
В Javascript одинарные и двойные кавычки взаимозаменяемы.
плохой совет, потому что текст может случайно содержать содержимое, похожее на HTML-разметку
element.innerHTML = "<script>doSomethingMalicious()</script>"; не будет хорошей идеей. element.innerHTML = "& neither will this";
Если вы действительно хотите, чтобы мы просто продолжили с того места, на котором остановились, вы можете сделать:
if (fieldNameElement)
fieldNameElement.innerHTML = 'some HTML';
Я бы использовал метод update от Prototype, который поддерживает простой текст, фрагмент HTML или любой объект JavaScript, определяющий метод toString.
$("field_name").update("New text");
@Aeyoun OP подразумевает, что они уже использовали Prototype, поэтому в этом случае имеет смысл воспользоваться им.
Почему у меня работает только с $("field_name").text("new text");
@Drako Вы используете PrototypeJS?
@Drako Исходный вопрос и мой ответ семилетней давности относятся к PrototypeJS, а не jQuery.
function showPanel(fieldName) {
var fieldNameElement = document.getElementById(field_name);
fieldNameElement.removeChild(fieldNameElement.firstChild);
var newText = document.createTextNode("New Text");
fieldNameElement.appendChild(newText);
}
Лучше заменить узел, чем удалить его и добавить новый в виде двух отдельных операций.
Быстрый ответ - использовать 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));
}
Преимущества этого:
Если бы я собирался использовать библиотеку javascript, я бы использовал jQuery и сделал бы следующее:
$("div#field_name").text(fieldName);
Обратите внимание, что Комментарий @AnthonyWJones верен: «field_name» не является особенно описательным идентификатором или именем переменной.
На какие другие языки вы могли бы перенести эту технику?
Любой язык с реализацией DOM поддерживает это (и большинство языков имеют реализацию DOM).
Это хороший ответ, лучше моего, и это правильный ответ. Тем не менее, вы можете подумать о приведении примера в порядок. "fieldname" - не лучшее название для параметра функции. На самом деле, может быть лучше взять два: один для идентификатора элемента, а другой - для содержимого, т. Е. elemID, содержание
Я позаимствовал fieldName и идентификатор из самого вопроса.
Вопрос, вероятно, использовал field_name, чтобы сделать пример универсальным. Также спрашивающий упоминает, что Prototype доступен, но не jQuery.
Обратите внимание, что textContent обеспечивает то же самое, innerHTML теперь является стандартом, и вы можете использовать document вместо fieldNameElement.ownerDocument.
Если вы склонны использовать на своем сайте много JavaScript, jQuery делает игру с DOM чрезвычайно простой.
http://docs.jquery.com/Manipulation
Делает это так просто, как: $ ("# field-name"). text ("Новый текст.");
У Prototype похожие полезные функции.
Вот простой способ jQuery:
var el = $('#yourid .yourclass');
el.html(el.html().replace(/Old Text/ig, "New Text"));
Это кажется плохой идеей - что, если ваш элемент содержит подузлы с таким же текстом или ваш текст соответствует части имени тега элемента? Почему не использовать просто .text?
Я полностью согласен с Джеймсом Вестгейтом, не стоит этого делать.
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, но все ответы сильно устарели и зависят от библиотек, которые делают то, что все текущие браузеры делают из коробки.
fieldNameElement.textContent = "New text";
@Legolas Поэтому два года назад мы написали «текущий браузер».
Спасибо! Я пробовал другие ответы, задаваясь вопросом, почему «innerHTML» не работает.
Вы можете подумать о том, почему textContent превосходит innerHTML: он быстрее, безопаснее и уместнее, когда вы не пытаетесь намеренно вставить разметку HTML.
Используйте innerText, если вы не можете предполагать структуру - Используйте данные Text # для обновления существующего текста Тест производительности
В HTML поместите это
<div id = "field_name">TEXT GOES HERE</div>
В Javascript поместите это
var fieldNameElement = document.getElementById('field_name');
if (fieldNameElement)
{fieldNameElement.innerHTML = 'some HTML';}
Делает ли принятый ответ то, что вы хотите, когда ему назначен такой текст: - <span style = "font-size: 36pt"> Это большой </span>. Если такое поведение желательно, можете ли вы перефразировать вопрос, чтобы он соответствовал?