我正在呈现一个自定义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>
有谁能解释一下为什么会出现这个评论,我怎么删掉它?
提前感谢!
这是特定于MyFaces实现的,而不是JSF规范。Mojarra的实现不会这样做。
这种将JavaScript主体放在HTML注释中的方法基本上是HTML史前时代的残余,当时浏览器不支持<script>
元素。这些HTML注释基本上隐藏了JavaScript内容,以防止那些古老的HTML解析器将JavaScript代码解释和显示为纯文本。
参见Mozilla Developer Network -为XHTML编写JavaScript:
这在HTML中是常见的做法,将脚本隐藏在不支持JS的浏览器中。在XML时代,注释就是它们的本意:注释。在处理文件之前,所有注释都将从文档中删除,因此将脚本包含在其中就像将午餐扔进食人鱼池一样。而且,注释掉你的脚本是没有意义的——在过去十年里编写的浏览器都不会在页面上显示你的代码。
注意最后一句话,这是真的,在过去的十年里,没有一个浏览器能做到这一点。MyFaces显然有点过于热心地假设人们现在还会使用这样一个史前浏览器。
ok
实践是将javascript代码标记为注释,因此自动工具不会试图将其解析为HTML(例如,检查页面是否符合HTML 4的工具)。
Javascript引擎将忽略HTML注释并处理代码(Javascript注释是/*
和//
出于同样的原因,这种方法的一种变体是将Javascript放在CDATA
标记中。