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

sbl*_*ndy 160 html javascript dom

我需要动态地在DIV元素中设置文本.什么是最好的浏览器安全方法?我有prototypejs和scriptaculous可用.

<div id="panel">
  <div id="field_name">TEXT GOES HERE</div>
</div>
Run Code Online (Sandbox Code Playgroud)

这是函数的样子:

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

17 *_* 26 245

你可以简单地使用:

fieldNameElement.innerHTML = "My new text!";
Run Code Online (Sandbox Code Playgroud)

  • 在Javascript中,单引号和双引号是可互换的. (45认同)
  • 不好的建议,因为文本可能偶然包含类似HTML标记的内容 (18认同)
  • `element.innerHTML ="<script> doSomethingMalicious()</ script>";``不是个好主意.`element.innerHTML ="&不会这个";` (10认同)
  • 在PHP中,是的.在JavaScript中,我不认为这很重要. (5认同)
  • 单引号不应该用于"静态"文本吗? (2认同)

mik*_*ana 161

更新了2013年及以后阅读此内容的所有人:

这个答案有很多搜索引擎优化,但所有的答案都严重过时,并依赖于图书馆来做所有当前浏览器开箱即用的事情.

要替换div元素中的文本,请使用所有当前浏览器中提供的Node.textContent.

fieldNameElement.textContent = "New text";
Run Code Online (Sandbox Code Playgroud)

  • @Legolas因此两年前写了"当前的浏览器". (10认同)
  • 您可能会考虑详细说明为什么 `textContent` 是一种优于 `innerHTML` 的方法:当不刻意插入 HTML 标记时,它更快、更安全、更合适。 (3认同)
  • 谢谢!我正在尝试其他答案,想知道为什么'innerHTML'无效. (2认同)

Dan*_*ian 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));
}
Run Code Online (Sandbox Code Playgroud)

这样做的好处是:

  1. 它只使用DOM,因此该技术可以移植到其他语言,并且不依赖于非标准的innerHTML
  2. fieldName可能包含HTML,这可能是一次尝试的XSS攻击.如果我们知道它只是文本,我们应该创建一个文本节点,而不是让浏览器为HTML解析它

如果我打算使用javascript库,我会使用jQuery,并执行以下操作:


  $("div#field_name").text(fieldName);
Run Code Online (Sandbox Code Playgroud)

请注意@AnthonyWJones的注释是正确的:"field_name"不是特别描述性的id或变量名.


Joh*_*ley 47

我会使用Prototype的update方法,它支持纯文本,HTML片段或定义toString方法的任何JavaScript对象.

$("field_name").update("New text");
Run Code Online (Sandbox Code Playgroud)

  • 为什么要使用框架来完成这么小的任务? (97认同)
  • @Aeyoun OP暗示他们已经在使用Prototype,所以如果是这样的话,那么利用它是有意义的. (26认同)
  • @Drako七年前的原始问题和我的答案是针对PrototypeJS而不是jQuery. (10认同)
  • 为什么我只使用`$("field_name").text("new text");` (6认同)

cee*_*yoz 17

$('field_name').innerHTML = 'Your text.';
Run Code Online (Sandbox Code Playgroud)

Prototype的一个漂亮功能就是$('field_name')做同样的事情document.getElementById('field_name').用它!:-)

John Topley使用Prototype update函数的答案是另一个很好的解决方案.

  • 那看起来不像JavaScript? (3认同)
  • @RaduSimionescu不,不是.这个问题和答案是关于Prototype.js,而不是jQuery.在Prototype中,`$`按ID查找项目.它不像jQuery那样基于选择器.http://api.prototypejs.org/dom/dollar/ (3认同)

Ant*_*nes 15

快速回答是使用innerHTML(或原型的更新方法,这几乎是一样的).innerHTML的问题是您需要转义所分配的内容.根据您的目标,您需要使用其他代码OR

在IE中: -

document.getElementById("field_name").innerText = newText;
Run Code Online (Sandbox Code Playgroud)

在FF: -

document.getElementById("field_name").textContent = newText;
Run Code Online (Sandbox Code Playgroud)

(实际上FF的代码中有以下内容)

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

HTMLElement.prototype.__defineSetter__("innerText", function (inputText) { this.textContent = inputText; })
Run Code Online (Sandbox Code Playgroud)

现在我可以使用innerText,如果你需要尽可能广泛的浏览器支持,那么这不是一个完整的解决方案,但是在raw中都没有使用innerHTML.


Mil*_*kov 6

如果你真的希望我们继续你离开的地方,你可以这样做:

if (fieldNameElement)
    fieldNameElement.innerHTML = 'some HTML';
Run Code Online (Sandbox Code Playgroud)


pal*_*wim 6

nodeValue 也是您可以使用的标准 DOM 属性:

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