如何替换div元素内的文本?


166

我需要动态设置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

可以在XSS注入攻击中使用它吗?
詹姆斯·韦斯特盖特,2012年

Answers:


49

我会使用Prototype的update方法,该方法支持纯文本,HTML代码段或任何定义toString方法的JavaScript对象。

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

26
@Aeyoun OP暗示他们已经在使用Prototype,因此,在这种情况下,可以利用它。
约翰·托普利

6
为什么对我只和$("field_name").text("new text");
Drako合作

@Drako您在使用PrototypeJS吗?
约翰·托普利

10
@Drako最初的问题和我七年前的回答是针对PrototypeJS而不是jQuery的。
约翰·托普利

255

您可以简单地使用:

fieldNameElement.innerHTML = "My new text!";

2
单引号不应该用于“静态”文本吗?
米兰·巴布斯科夫

5
在PHP中,是的。在JavaScript中,我认为这并不重要。
ceejayoz's

46
在Javascript中,单引号和双引号可以互换。

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 2015年

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,因此该技术可移植到其他语言,并且不依赖于非标准的innerHTML
  2. fieldName可能包含HTML,这可能是XSS攻击未遂。如果我们知道它只是文本,则应该创建一个文本节点,而不是让浏览器将其解析为HTML。

如果要使用javascript库,请使用jQuery,并执行以下操作:


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

请注意,@ AnthonyWJones的注释是正确的:“ field_name”不是特别描述性的ID或变量名。


您可以将此技术移植到哪些其他语言?
约翰·托普利

任何具有DOM实现的语言都支持此功能(大多数语言都具有DOM实现)。
昆汀

这是个好答案,比我的要好,是正确的答案。您可能会考虑整理示例。“ fieldname”不是函数参数的好名字。实际上,最好将两个元素分别用作元素ID和内容。elemID,内容
AnthonyWJones

我从问题本身借来了fieldName和ID。
Daniel Papasian

这个问题可能使用field_name来使示例通用。发问者还提到Prototype可用,但jQuery不可用。
John Topley

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

原型的漂亮功能之一是与原型$('field_name')做相同的事情document.getElementById('field_name')。用它!:-)

John Topley使用原型update函数的答案是另一个很好的解决方案。


4
看起来不像JavaScript吗?
米兰·巴布斯科夫

1
不要使用innerHTML。这不是w3c建议,并且行为不一致。被认为是不好的风格。
汤姆(Tom)

汤姆,应该改用什么(如果您不使用原型)?
米兰·巴布斯科夫

1
米兰,更受欢迎的方法是遍历childNodes,在每个childNodes上调用removeNode(true),然后追加使用document.createElement()或document.createTextNode()创建的新节点。如果您需要这样做,我建议您编写一个函数以避免过多的键入操作。
Joel Anair

3
@RaduSimionescu不,不是。这个问题和答案是关于Prototype.js的,而不是jQuery的。在原型中$按ID查找项目。它不像jQuery那样基于选择器。api.prototypejs.org/dom/dollar
ceejayoz 2012年

15

快速的答案是使用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。


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";
}




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?
詹姆斯·韦斯特盖特,2012年

我完全同意詹姆斯·韦斯特盖特(James Westgate)的观点,不应这样做。
TGarrett,2015年

0

在HTML中放这个

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

用Javascript写这个

var fieldNameElement = document.getElementById('field_name');
        if (fieldNameElement)
        {fieldNameElement.innerHTML = 'some HTML';}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.