javascript - 实体名称必须紧跟实体引用中的 '&'

标签 javascript xml jsf xhtml facelets

我想在我的 *.xhtml 页面上放一个 packman 游戏。(我正在使用 jsf 2 和 primefaces 3.5)

但是,

当我在 xhtml 中“翻译”html 页面时,我在这个脚本中遇到错误:

    <script>

    var el = document.getElementById("pacman");

    if (Modernizr.canvas && Modernizr.localstorage && 
        Modernizr.audio && (Modernizr.audio.ogg || Modernizr.audio.mp3)) {
      window.setTimeout(function () { PACMAN.init(el, "./"); }, 0);
    } else { 
      el.innerHTML = "Sorry, needs a decent browser<br /><small>" + 
        "(firefox 3.6+, Chrome 4+, Opera 10+ and Safari 4+)</small>";
    }
  </script>

在线:

if (Modernizr.canvas && Modernizr.localstorage && 

我得到:

The entity name must immediately follow the '&' in the entity reference.

知道如何解决这个问题吗?

最佳答案

到目前为止发布的所有答案都给出了正确的解决方案,但是没有一个答案能够正确解释具体问题的根本原因。

Facelets 是一种基于 XML 的 View 技术,它使用 XHTML+XML 生成 HTML 输出。 XML 有五个特殊字符,XML 解析器对其进行特殊处理:

  • < 标记的开始。
  • > 标签结束。
  • " 属性值的开始和结束。
  • ' 属性值的替代开始和结束。
  • & 实体的开始(以 ; 结束)。

In case of & which is not followed by # (e.g. &#160; , &#xA0; , etc), the XML parser is implicitly looking for one of the five predefined entity names lt , gt , amp , quot and apos , or any manually defined entity name .但是,在您的特定情况下,您将 & 用作 JavaScript 运算符,而不是 XML 实体。这完全解释了您遇到的 XML 解析错误:

The entity name must immediately follow the '&' in the entity reference

本质上,您在错误的地方编写了 JavaScript 代码,一个 XML 文档而不是一个 JS 文件,因此您应该相应地转义所有 XML 特殊字符。 & 必须转义为 &amp;

因此,在您的特定情况下,

if (Modernizr.canvas && Modernizr.localstorage && 

必须成为

if (Modernizr.canvas &amp;&amp; Modernizr.localstorage &amp;&amp;

使它对 XML 有效。

但是,这会使 JavaScript 代码更难阅读和维护。如果您想在 XML 文档的 JavaScript 代码中继续使用 & 而不是 &amp;,那么您应该将 JavaScript 代码放在字符数据 (CDATA) block 中。因此,在 JSF 术语中,这将是:

<h:outputScript>
    <![CDATA[
        // ...
    ]]>
</h:outputScript>

XML 解析器会将 block 的内容解释为“普通”字符数据而不是 XML,因此“按原样”解释 XML 特殊字符。

但是,更好的方法是将 JS 代码放在它自己的 JS 文件中,该文件由 <script src> 包含,或者用 JSF 术语来说,就是 <h:outputScript>

<h:outputScript name="onload.js" target="body" />

(注意 target="body" ;这样 JSF 会自动在 <script> 的末尾呈现 <body>,而不管 <h:outputScript> 本身位于何处,从而实现与 window.onload$(document).ready() 相同的效果;所以你不用需要在该脚本中再使用它们)

这样您就不必担心 JS 代码中的 XML 特殊字符。作为额外的好处,这使您有机会让浏览器缓存 JS 文件,从而使总响应大小更小。

另见:

关于javascript - 实体名称必须紧跟实体引用中的 '&',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16303779/

相关文章:

java - 如何解析 android Activity_main.xml 文件并修改它?

Eclipse Tomcat 错误 404

java - Java 中类似 Facebook 的通知实现

javascript - 禁用带有字符白名单的表单提交

JavaScript/Jquery - 调用 html() 后脚本不起作用

Javascript 代码已更改/主横幅无法正常工作

java - 解析带有特殊字符的 XML 时出现 JDOM SAXParseException

php - 我如何告诉 DOMDocument->load() 我希望它使用什么编码?

javascript - 奇怪的 jQuery 问题

javascript - 检测fb_share javascript按钮点击