代码之家  ›  专栏  ›  技术社区  ›  Adam Gent

保持jspx不创建自动关闭标记(<div><div>!= < div/>

  •  6
  • Adam Gent  · 技术社区  · 16 年前

    JSPX有旋转的可爱的副作用:

    <div class="magic"></div>
    

    进入:

    <div class="magic" />
    

    对于许多浏览器,这会导致布局混乱和混乱,即使它是有效的XHTML。 因此,我使用了一个groovy脚本,用以下regex查找所有可能的坏HTML:

    def m = html =~ /<(\w+)[^>]*?><\/(\w+)>/
    def bad = m.findAll { it[1] == it[2]  };
    

    5 回复  |  直到 13 年前
        1
  •  3
  •   Community Mohan Dere    9 年前

    对于这个问题,没有优雅的解决方案(阅读:可在容器级别配置)。“检查” jspx script element on GlassFish v3 “为了可能的解决办法。

        2
  •  10
  •   Glenn Lane    15 年前

    我一直在使用 <div><jsp:text/></div>

        3
  •  2
  •   Mads Hansen    16 年前

    您可以尝试在元素中指定不会影响HTML呈现方式的内容,但会阻止将XHTML序列化为自关闭元素;例如 注释、处理指令或不间断空白字符 ( &#x200B; )

        4
  •  2
  •   Community Mohan Dere    9 年前

    您还可以创建自定义的taglib或封装 <div></div> 在CDATA中。这里更多: How to produce valid HTML with JSPX? (not XHTML)

        5
  •  1
  •   Adam Gent    15 年前

    正如尼姆所指出的,这个问题似乎没有解决办法。 不过,我已经编写了一个groovy脚本,您可以让maven call(gmaven)检查可能会自动关闭的XHTML标记。

    这个脚本可能需要更好的错误消息,并不能处理所有的情况,但到目前为止已经减轻了问题。

    #!/usr/bin/env groovy
    
    
    def srcdir = project.properties['srcdir'];
    def badFiles = [];
    
    def checkFile(badFiles, file) {
        def htmlLines = file.readLines();
        def found = [];
        int i = 0;
        for (html in htmlLines) {
            ++i;
            //print html;
            def m = html =~ /<(\w+)[^>]*?><\/(\w+)>/
            def bad = m.findAll { it[1] == it[2]  };
            if (bad)
                found.add(['bad' : bad, 'line' : i]);
        }
        if (found) {
            badFiles << file;
            println "File had bad HTML: " + file.canonicalPath;
            println found;
        }
    
    }
    
    def ant = new AntBuilder();
    scanner = ant.fileScanner {
        fileset(dir:srcdir) {
            include(name:"**/*.jspx")
        }
    }
    
    for (f in scanner) {
        //println "Checking file: " + f.canonicalPath;
        checkFile(badFiles, f);
    }
    if (badFiles) { 
        println "Bad files: " + badFiles;
        fail('Bad files: ' + badFiles);
    }
    
    推荐文章