JavaScript document.write(编码的html标签),按原样打印

时间:2013-02-03 18:18:53

标签: php javascript html xml

我使用javascript从XML生成HTML页面(从XML文件生成表格), 我有一些XML结构等。我编写HTML代码如下

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

我得到我的变量如下

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

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

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

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

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

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

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

换句话说:我如何使用JS(document.write)在文本上写下文字: <?php $=1; ?> <htmltag>whatever is here </htmltag> 而不会损坏我的真实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>");

1 个答案:

答案 0 :(得分:0)

你尝试使用“单引号”吗? :

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

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

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