转义 Javascript 序列的最简单方法是什么,如果嵌入到 HTML 代码的脚本标签中,会导致不需要的功能

what's the simplest way to escape Javascript sequences that would result in undesired functionality if embedded in the script tags of HTML code?

本文关键字:标签 脚本 代码 功能 不需要 HTML 最简单 Javascript 方法 是什么 转义      更新时间:2023-09-26

我最近做过一个项目,要求我从.js文件中读取javascript代码,并将其嵌入HTML代码的脚本标签中。我认为这是一项微不足道的任务,直到我了解到某些在.js文件中不会引起问题的序列,如果嵌入在 HTML 文件的脚本标签中,可能会导致不需要的功能。

例如,如果具有有效 javascript 代码的.js文件包含如下序列:

/*
    ...comments...
    Add the following to your HTML:
    <script language="javascript" src="samplejs.js"></script>
    ...comments...
 */

。那么这些序列,当嵌入在HTML文件的脚本标签中时,当解释器点击行时会导致问题

"<script language="javascript" src="samplejs.js"></script>"

(至少在 Firefox 中是这样。

由于正则表达式...

"'<script.*'>.*'</script'>"

。将捕获脚本标记,即使它们显示为字符串文本的一部分。即:

document.write('<div><script>doSomething()</script></div>')

。解决问题的方法是否是一个更健壮的正则表达式(类似于

"/'*.*'<.*'>.*'</.*'>.*'*/"

...),还是不同的方法?

(假设删除所有注释不是一种选择)

最简单的,对你来说最省力?我会在进入时通过诸如UglifyJS之类的简化器运行它,它应该删除评论等内容。

我想不出通过 ajax 读取文件并将它们写入<script>标签的理由,但如果您使用正确的方法(例如createTextNode或分配给 text/textConent/innerText 属性),这应该完全没有问题。

但是,如果您使用的是document.write,您当然需要转义其中的任何 HTML。这意味着用各自的实体取代<>&"

你能用'u003C/script>替换所有</script>实例吗?理论上,这不会影响字符串(自''u003C' == '<'以来),但它可以防止浏览器误解注释(/*'u003C/script>*/不会过早结束脚本块)。

由于这似乎是自动化的,我假设偶尔"破坏"字符串不会引起任何胃灼热。

相关文章: