转义 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?
我最近做过一个项目,要求我从.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>*/
不会过早结束脚本块)。
由于这似乎是自动化的,我假设偶尔"破坏"字符串不会引起任何胃灼热。