【问题标题】:JavaScript document.write(encoded html tag), print as it isJavaScript document.write(encoded html tag),按原样打印
【发布时间】:2013-02-03 18:18:53
【问题描述】:

我正在使用 javascript 从 XML 生成 HTML 页面(从 XML 文件生成表), 好吧,我有某种 XML 结构等。我编写 HTML 代码如下

document.write("<span>" + name + "</span>");

我得到我的变量如下

name = x[i].getElementsByTagName("NAME")[0].childNodes[0].nodeValue;

所以变量 name 包含我的 XML 文件结构中的任何节点 NAME 包含 简单的 XML 演示:

<FILE>
<NAME>file 1.2.3</NAME>
<SIZE>1Kb</SIZE>
</FILE>

用户正在编辑 XML 文件,因此用户可以插入他/她想要的任何内容,因此如果用户在 NAME 节点中输入:&lt;script&gt;alert(1);&lt;/script&gt; JavaScript 将打印出常规 HTML,浏览器将调用“alert” (1)”。这就是我不想发生的事情。

所有的编辑都是用“我的”前端完成的,并通过 php 函数 htmlspecialchars();所以实际上用户将保存到 NAME 节点的内容是“编码”的 HTML

&lt;script&gt;alert(3);&lt;/script&gt;

即使这还不够,当 XML 与编码的 HTML 标签一起保存时,javascript 会将它们打印为普通标签。

换句话说:如何使用 JS (document.write) 在页面上写以下文本:&lt;?php $=1; ?&gt;&lt;htmltag&gt;whatever is here &lt;/htmltag&gt; 而不会损坏我的真实 HTML。

有什么办法吗?

例如,这不符合我的预期:

document.write("<span class=\"edit\">&lt;script&gt;alert(3);&lt;/script&gt;</span>");

解决方案

在网上找到了这个功能

function htmlspecialchars(str) {
 if (typeof(str) == "string") {
  str = str.replace(/&/g, "&amp;"); /* must do &amp; first */
  str = str.replace(/"/g, "&quot;");
  str = str.replace(/'/g, "&#039;");
  str = str.replace(/</g, "&lt;");
  str = str.replace(/>/g, "&gt;");
 }
return str;
}

它完成了工作,但我真的不明白为什么。

在 XML 文件中,它已经“编码”或以可以安全呈现的形式(发送到 document.write 函数)。我只是再次执行“htmlspecialchars”,效果很好。

document.write("<span>" + htmlspecialchars(name) + "</span>");

【问题讨论】:

  • 如果没有正确编码,您将无法在 HTML 中逐字打印 XML。 &lt; 例如是 HTML 中的特殊字符。见 SGML,HTML:tools.ietf.org/html/rfc1866#section-3.1
  • 根据您的目标,您需要处理 CDATA 部分,因为 HTML 没有这些,但 XML 有它们。此外,如果您在网络上找到了某些东西,请留下您从中获得的链接。还要添加您的解决方案作为答案,而不是通过编辑问题。那就接受吧。这就是这个网站的运作方式。

标签: php javascript html xml


【解决方案1】:

您是否尝试使用“单引号”? :

document.write('<span class="edit">' + name + '</span>');

如果你想创建动态元素,并且如果你想再次在 javascript 中使用这些元素,你应该使用 DOM 函数(createElement、createTextNode、createAttribute):

http://reference.sitepoint.com/javascript/Document/createElement

【讨论】:

  • 我只是用 javascript 生成表,问题是当 name 包含编码的 html 标记时,它被打印为“普通”标记。它与单引号无关(我 99% 确定)。
猜你喜欢
  • 2021-10-21
  • 2023-03-06
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多