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

IT技术 javascript html dom
2021-01-22 13:39:41

我需要在 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
}
6个回答

您可以简单地使用:

fieldNameElement.innerHTML = "My new text!";
不应该对“静态”文本使用单引号吗?
2021-03-16 13:39:41
element.innerHTML = "<script>doSomethingMalicious()</script>";不会是个好主意。 element.innerHTML = "& neither will this";
2021-03-20 13:39:41
糟糕的建议,因为文本可能偶然包含类似 HTML 标记的内容
2021-03-27 13:39:41
在 Javascript 中,单引号和双引号是可以互换的。
2021-04-04 13:39:41
在 PHP 中,是的。在 JavaScript 中,我认为这并不重要。
2021-04-10 13:39:41

为 2013 年及以后阅读本文的所有人更新:

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

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

fieldNameElement.textContent = "New text";
谢谢!我正在尝试其他答案,想知道为什么“innerHTML”不起作用。
2021-03-27 13:39:41
您可能会考虑详细说明为什么textContent是一种更好的方法innerHTML:在不刻意插入 HTML 标记的情况下,它更快、更安全且更合适。
2021-03-29 13:39:41
@Legolas 因此在两年前编写了“当前浏览器”。
2021-04-07 13:39:41

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 实现)。
2021-03-16 13:39:41
该问题可能使用 field_name 使示例通用。提问者还提到 Prototype 可用但 jQuery 不可用。
2021-03-18 13:39:41
我从问题本身借用了 fieldName 和 ID。
2021-03-28 13:39:41
您可以将此技术移植到哪些其他语言?
2021-04-08 13:39:41
这是一个很好的答案,比我的好,是正确的答案。不过,您可能会考虑整理示例。'fieldname' 不是函数参数的好名字。事实上,最好将两个一个用于元素 ID,另一个用于内容,即;elemID,内容
2021-04-08 13:39:41

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

$("field_name").update("New text");
@Aeyoun OP 暗示他们已经在使用 Prototype,所以如果是这种情况,利用它是有意义的。
2021-03-14 13:39:41
@Drako 你在使用 PrototypeJS 吗?
2021-03-23 13:39:41
@Drako 最初的问题和我七年前的回答是针对 PrototypeJS 而不是 jQuery。
2021-03-23 13:39:41
为什么对我来说只适用于 $("field_name").text("new text");
2021-03-24 13:39:41
$('field_name').innerHTML = 'Your text.';

Prototype 的一项漂亮功能是,$('field_name')它与document.getElementById('field_name'). 用它!:-)

John Topley 使用 Prototypeupdate函数的回答是另一个很好的解决方案。

@RaduSimionescu 不,不是。这个问题和答案是关于 Prototype.js,而不是 jQuery。在 Prototype 中$,通过 ID 查找项目。它不像 jQuery 那样基于选择器。api.prototypejs.org/dom/dollar
2021-03-21 13:39:41
汤姆,应该用什么代替(如果你不使用原型)?
2021-03-28 13:39:41
这看起来不像 JavaScript?
2021-04-04 13:39:41
米兰,更被接受的方法是循环遍历 childNode,在每个子节点上调用 removeNode(true),然后附加使用 document.createElement() 或 document.createTextNode() 创建的新节点。如果您需要这样做,我建议您编写一个函数以避免大量输入。
2021-04-05 13:39:41
不要使用innerHTML。这不是 w3c 的建议并且行为不一致。它被认为是不好的风格。
2021-04-10 13:39:41