【问题标题】:Custom JSF component: Using "startElement" with "script" results in a comment自定义 JSF 组件:将“startElement”与“script”一起使用会产生注释
【发布时间】:2013-03-06 19:13:55
【问题描述】:

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

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

提前致谢!

【问题讨论】:

    标签: jsf comments myfaces custom-renderer


    【解决方案1】:

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

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

    另见Mozilla Developer Network - Writing JavaScript for XHTML

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

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

    【讨论】:

    • 感谢林,BalusC。我没有意识到这一点。
    • 还有一个 Web Context 参数来控制这个:myfaces.apache.org/core20/myfaces-impl/… 描述:用 xml 注释将内容包裹在脚本中,以防止旧浏览器显示它。默认为真。
    【解决方案2】:

    没关系

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

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

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

    【讨论】:

    • 感谢您的解释,所以我就让它保持原样吧! :)
    • 这与自动工具无关。如果一个工具做到了这一点,那将是一个古老的工具或工具中的错误。
    猜你喜欢
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2013-10-02
    • 1970-01-01
    • 2012-08-02
    • 2011-09-17
    • 2016-08-01
    相关资源
    最近更新 更多