1

我正在渲染一个自定义 JSF 组件。在方法encodeBegin 中,我想包含一些 java 脚本。

public void encodeBegin(FacesContext context) throws IOException {
   ResponseWriter writer = context.getResponseWriter();
   writer.startElement("script", this);
   writer.writeAttribute("type", "text/javascript", null);
   writer.writeText("var width=400",null);
   writer.endElement("script");
}

渲染组件时,脚本标记的内容被注释掉。

<script type="text/javascript"><!--
var width=400;
//--></script>

谁能解释为什么会出现此评论以及我如何摆脱它?

提前致谢!

4

2 回答 2

3

这是特定于 MyFaces 实现的,而不是 JSF 规范。Mojarra 实现不这样做。

这种将 JavaScript 正文放在 HTML 注释中的方法基本上是 HTML 史前史的遗留物,当时存在不支持<script>元素的浏览器。那些 HTML 注释基本上隐藏了 JavaScript 内容,以防止那些古老的 HTML 解析器将 JavaScript 代码解释和显示为纯文本

另请参阅Mozilla 开发人员网络 - 为 XHTML 编写 JavaScript

这是 HTML 中的常见做法,用于对不支持 JS 的浏览器隐藏脚本。在 XML 时代,注释就是它们的本意:注释。在处理文件之前,所有注释都将从文档中删除,因此将您的脚本包含在其中就像将您的午餐扔进食人鱼池一样。此外,注释掉你的脚本真的没有意义——过去十年编写的浏览器都不会在页面上显示你的代码。

请注意最后一句话,这是非常正确的,过去十年开发的任何单一浏览器都不会再这样做了。MyFaces 显然有点过分热心地假设现在仍然会使用这种史前浏览器。

于 2013-03-18T13:11:37.827 回答
1

没关系

这种做法是将 javascript 代码标记为注释,因此自动工具不会尝试将其解析为 HTML(例如,检查您的页面是否符合 HTML 4 的工具)。

Javascript 引擎将忽略 HTML 注释并处理代码(Javascript 注释是/*//

出于同样的原因,这种方法的一种变体是将 Javascript 放在CDATA标签中。

于 2013-03-18T12:40:09.767 回答