【发布时间】:2011-11-29 01:43:25
【问题描述】:
我有一个包含用户生成字符串的 Ruby 哈希。我需要将此哈希传递给 JavaScript,以便对其进行处理。我尝试过使用 JSON,它在大多数情况下都有效,但是当哈希包含文本 </script> 时会中断。这是在 Chrome 和 FF8 中中断的最简单的代码:
<%
obj = {
:foo => '</script>'
}
%>
<script type="text/javascript">
var obj = <%= obj.to_json %>; // Results in JS syntax error
</script>
这会产生以下 HTML:
<script type="text/javascript">
var obj = {"foo":"</script>"};
</script>
我还尝试将 JSON 用引号括起来(单引号和双引号),以便可以通过 jQuery.parseJSON() 解析它,但会导致相同的语法错误:
<%
obj = {
:foo => '</script>'
}
%>
<script type="text/javascript">
var json = '<%= obj.to_json %>'; // Again results in JS syntax error
</script>
语法错误似乎是浏览器试图将</script> 文本解释为脚本块结尾的结果。我目前的解决方案是将JSON字符串转义为HTML,转义剩余的反斜杠,将其作为字符串写入JS,将HTML转义,然后最后解析JSON:
<%
obj = {
:foo => '</script>'
}
json = obj.to_json
escaped_json = CGI.escapeHTML(json)
slashed_escaped_json = escaped_json..gsub(/['"\\\x0]/,'\\\\\0')
%>
<script type="text/javascript">
var json = "<%= slashed_escaped_json %>";
json = $('<div/>').html(json).text(); // unescape HTML
var obj = jQuery.parseJSON(json); // parse JSON safely
console.log(obj);
</script>
它有效,但它很难看。有没有更好的办法?我不想去掉</script>,因为我在将内容呈现在页面上之前将其转义为 HTML 实体。
【问题讨论】:
标签: javascript ruby json