自定义JSF组件:将“startElement”与“script”一起使用会产生注释

时间:2013-03-18 12:37:15

标签: jsf comments myfaces custom-renderer

我正在渲染自定义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>

有人可以解释为什么会出现这个评论以及我如何摆脱它?

提前致谢!

2 个答案:

答案 0 :(得分:3)

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

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

另见Mozilla Developer Network - Writing JavaScript for XHTML

  

这是HTML中的常见做法,用于从不具备JS功能的浏览器中隐藏脚本。在XML时代,评论是他们的意图:评论。在处理文件之前,所有注释都将从文档中删除,因此将脚本包含在其中就像在食人鱼池中撒上午餐一样。此外,没有必要评论您的脚本 - 过去十年没有编写任何浏览器会在页面上显示您的代码。

请注意最后一句,这是非常正确的,过去十年中没有一个浏览器会再这样做了。假设现在仍然会使用这样的史前浏览器,MyFaces显然有点过于夸张。

答案 1 :(得分:1)

没关系

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

Javascript引擎会忽略HTML评论并处理代码(Javascript评论为/*//

此方法的一种变体是将Javascript置于CDATA标记内,原因相同。