0

在 html 中,我使用如下代码标记,并且我使用 css,如下所示:-

<style type="text/css">
    code { white-space: pre; }
</style>


<code>
    public static ArrayList<File> getFiles(File[] files){
        ArrayList<File> _files = new ArrayList<File>();    
        for (int i=0; i<files.length; i++)
            if (files[i].isDirectory())
                _files.addAll(getFiles(new File(files[i].toString()).listFiles()));
            else 
                _files.add(files[i]);
        return _files;
    } 

    public static File[] getAllFiles(File[] files) {
        ArrayList<File> fs = getFiles(files);
        return (File[]) fs.toArray(new File[fs.size()]); 
    }
</code>

当我使用如上所示的代码标记时,在查看时 html 页面中缺少部分代码。当查看上面的 html 页面时,输出如下所示:-

public static ArrayList getFiles(File[] files){
        ArrayList _files = new ArrayList();    
        for (int i=0; i fs = getFiles(files);
        return (File[]) fs.toArray(new File[fs.size()]); 
    }

在第一种方法中,缺少某些部分,而第二种方法根本没有出现。有什么问题以及如何解决?

4

2 回答 2

1

<File>您的标签中有这些<code>,您需要将它们转换为&lt;html&gt;实体

演示

<code>
    public static ArrayList&lt;File&gt; getFiles(File[] files){
        ArrayList&lt;File&gt; _files = new ArrayList&lt;File&gt;();    
        for (int i=0; i&lt;files.length; i++)
            if (files[i].isDirectory())
                _files.addAll(getFiles(new File(files[i].toString()).listFiles()));
            else 
                _files.add(files[i]);
        return _files;
    } 

    public static File[] getAllFiles(File[] files) {
        ArrayList&lt;File&gt; fs = getFiles(files);
        return (File[]) fs.toArray(new File[fs.size()]); 
    }
</code>
于 2013-05-17T07:21:46.707 回答
-1

正如外星人先生已经确定的那样,您的<code>块内有字符被解释为标记。

作为转义大量字符的替代方法,如果您的代码不包含 string </script,您可以利用<script>元素的解析和(非)执行行为,如下所示:

<code>
    <script type="text/x-code">
    public static ArrayList<File> getFiles(File[] files){
        ArrayList<File> _files = new ArrayList<File>();    
        for (int i=0; i<files.length; i++)
            if (files[i].isDirectory())
                _files.addAll(getFiles(new File(files[i].toString()).listFiles()));
            else 
        _files.add(files[i]);
        return _files;
    } 

    public static File[] getAllFiles(File[] files) {
        ArrayList<File> fs = getFiles(files);
        return (File[]) fs.toArray(new File[fs.size()]); 
    }
    </script>
</code>

使用这个 CSS:

script[type=text\/x-code] { 
  display: block; 
  white-space: pre; 
  line-height: 20px; 
  margin-top: -20px;
}

见 JSfiddle:http: //jsfiddle.net/fZuPm/3/


更新:在评论中,RoToRa 就这种方法的“正确性”提出了一些有趣的观点,我感谢 RoToRa。

使用类型属性来阻止脚本标记的内容作为 JavaScript 执行是一种很好理解的技术,尽管导致脚本执行的类型名称列表因浏览器而异,但找到一个不会导致执行的并不难。

更有趣的是语义问题。我认为 script 元素的语义本质上是惰性的,就像 div 或 span 元素一样,而 RoToRa 的观点是它会影响内容的语义。看规格,解决起来并不容易。HTML 4.01 很少提及脚本元素的语义,只关注其功能。

HTML5 规范也好不了多少,但它确实说“该元素不代表用户的内容。”。我不知道该怎么做。说一个元素不做什么并不是很有帮助。如果它暗示其内容在语义上对用户“隐藏”,从而其内容在语义上不是包含代码元素的内容的一部分,则不应使用此技术。

然而,如果这意味着脚本元素没有引入新的语义,那么似乎没有任何问题。

正如 RoToRa 所建议的那样,我找不到任何证据表明脚本元素在语义上需要包含脚本,尽管推断这一点可能被认为是常识,但这不是 HTML 语义的工作方式。

在许多方面,这种方法实际上是试图找到一种方法来有效地执行 XMP 元素在浏览器中所做的事情,但实际上是无效的。XMP 几乎在 HTML5 中有效,但只是错过了。编辑形容这是一个艰难的决定。像这样使用 script 元素可以满足该要求,但似乎仍然存在争议。如果您对这种方法所应用的任何语义感到不舒服,我建议您不要使用它。

于 2013-05-17T12:49:04.703 回答