【问题标题】:JSF 1.2 injecting javaScript that causes w3c Validation failureJSF 1.2 注入导致 w3c 验证失败的 JavaScript
【发布时间】:2012-06-14 07:37:53
【问题描述】:

我们项目的目标之一是确保呈现的 HTML 100% 符合 xhtml 1.0 过渡语法,该项目对 DDA 的要求很高。可悲的是,我有一个无法消除的错误。这是因为 JSF 将 javaScript 的以下 sn-p 注入页面(为清楚起见而格式化),因为它没有包含在 CDATA 中,因此被 w3c 验证器拒绝并显示以下消息:

Line 443, Column 122: character "<" is the first character of a delimiter but occurred as data

…dp;if (adp != null) {for (var i = 0;i < adp.length;i++) {f.removeChild(adp[i])…

?

This message may appear in several cases:

    You tried to include the "<" character in your page: you should escape it as "&lt;"
    You used an unescaped ampersand "&": this may be valid in some contexts, but it is recommended to use "&amp;", which is always safe.
    Another possibility is that you forgot to close quotes in a previous tag.

我的问题是是否可以让 JSF 将脚本块包装在 CDATA 中或将脚本外部化?

<script type="text/javascript" language="Javascript">
    function dpf(f) {
        var adp = f.adp;
        if (adp != null) {
            for (var i = 0;i < adp.length;i++) {
                f.removeChild(adp[i]);
     }}};

    function apf(f, pvp) {
        var adp = new Array();
        f.adp = adp;
        var ps = pvp.split(',');
        for (var i = 0,ii = 0;i < ps.length;i++,ii++) {
            var p = document.createElement("input");p.type = "hidden";p.name = ps[i];p.value = ps[i + 1];
            f.appendChild(p);
            adp[ii] = p;i += 1;
     }};

     function jsfcljs(f, pvp, t) {
        apf(f, pvp);
        var ft = f.target;
        if (t) {
            f.target = t;
        }
        f.submit();
        f.target = ft;dpf(f);
     };
</script>

【问题讨论】:

    标签: javascript jsf


    【解决方案1】:

    如果不编辑 JS 文件本身,这是不可能的。

    提取jsf-impl.jar 文件,将com/sun/faces/sunjsf.js 文件复制到webapp 项目中完全相同的包结构中,即作为sunjsf.js 文件在com.sun.faces 包中。将&amp;lt; 编辑为&amp;lt; 并保存。在类加载层次结构中,此文件将优先于 JAR 文件中的文件,因此将被使用。

    或者,您也可以始终使用编辑后的 ​​JS 文件重新构建 JAR 文件本身。

    【讨论】:

    • 太棒了 :) 我再次对你的 jsf 技能感到敬畏。
    【解决方案2】:

    尝试像这样更改您的脚本块

    <script type="text/javascript">
    //<[!CDATA[
    
      ...your code here
    
    //]]>
    </script>
    

    这应该使验证器解析器忽略整个脚本块:如果您的代码源包含大于 (>)、小于 (CDATA 分隔符中以使其验证。

    【讨论】:

    • 所以要么切换到另一种文档类型(例如 html5),要么忽略验证器消息...
    • 相信我,我希望能够放弃 xhtml 要求,但是这和语法合规性都是我们客户绝对不可动摇的要求,他们非常坚持这一点 - 但 BalusC 给了我我需要的答案。
    猜你喜欢
    • 2011-01-29
    • 2013-02-27
    • 2010-09-16
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多