[javascript] 엔티티 이름은 엔티티 참조에서 ‘&’바로 뒤에 와야합니다.

* .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 &&

나는 얻다:

엔티티 이름은 엔티티 참조에서 ‘&’바로 뒤에 와야합니다.

그것을 고치는 방법을 아십니까?



답변

지금까지 게시 된 모든 답변이 올바른 해결책을 제시하고 있지만 구체적인 문제의 근본 원인을 제대로 설명 할 수있는 답변은 없었습니다.

Facelets는 XHTML + XML을 사용하여 HTML 출력을 생성하는 XML 기반보기 기술입니다. XML에는 XML 파서에 의해 특수하게 처리되는 5 개의 특수 문자가 있습니다.

  • < 태그의 시작.
  • > 태그의 끝.
  • " 속성 값의 시작과 끝.
  • ' 속성 값의 대체 시작 및 끝.
  • &엔티티의 시작 (로 끝나는 ;).

경우의 &하는 따르지 #(예를 들면 &#160;, &#xA0;등), XML 파서는 암시 적으로 다섯 가지 중 하나를 찾고 미리 정의 된 개체 이름 lt , gt, amp, quotapos, 또는 수동으로 정의 된 엔티티 이름 . 그러나 특정 경우 &에는 XML 엔티티가 아닌 JavaScript 연산자 로 사용 했습니다. 이것은 XML 구문 분석 오류를 완전히 설명합니다.

엔티티 이름은 엔티티 참조에서 ‘&’바로 뒤에 와야합니다.

본질적으로, JS 파일 대신 XML 문서 인 잘못된 위치에 JavaScript 코드를 작성하고 있으므로 이에 따라 모든 XML 특수 문자를 이스케이프해야합니다. &로 이스케이프해야합니다 &amp;.

따라서 귀하의 특정 경우에는

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

되어야한다

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

XML 유효하게 만드십시오.

그러나 이로 인해 JavaScript 코드를 읽고 유지하기가 더 어려워집니다. Mozilla Developer Network의 뛰어난 문서 Writing JavaScript for XHTML 에서 언급했듯이 JavaScript 코드를 문자 데이터 (CDATA) 블록에 배치해야합니다. 따라서 JSF 용어로는 다음과 같습니다.

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

XML 파서는 블록의 내용을 XML이 아닌 “일반 바닐라”문자 데이터로 해석하므로 XML 특수 문자를 “있는 그대로”해석합니다.

그러나 훨씬 더 나은 방법은 <script src>. 또는 JSF 용어로 포함하는 자체 JS 파일에 JS 코드를 넣는 것 <h:outputScript>입니다.

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

(음 target="body",이 방법 JSF가 자동으로 렌더링됩니다 <script>의 맨 마지막 <body>에 관계없이 어디 <h:outputScript>자체가 본인과 같은 효과를 달성, 위치 window.onload등을 $(document).ready(), 당신은 그 스크립트에서 더 이상 사람들을 사용할 필요가 없습니다)

이렇게하면 JS 코드에서 XML 특수 문자에 대해 걱정할 필요가 없습니다. 추가 보너스로 브라우저가 JS 파일을 캐시하여 총 응답 크기를 줄일 수 있습니다.

또한보십시오:


답변

수동으로 통과하고 모든 XHTML 문자를 탈출하려는 경우가 아니면 당신은 (예, 스크립트 태그의 CDATA 태그 내부를 추가해야 &될 필요가있을 것이다 &amp;). 예를 들면 :

<script>
//<![CDATA[
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>


답변

파서가 일부 HTML 콘텐츠를 예상하고 있으므로 & 엔티티의 시작으로 같은 &egrave;.

이 해결 방법을 사용하십시오.

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

따라서 코드가 HTML 텍스트가 아니라 그대로 사용될 데이터임을 지정합니다.


답변

하다

<script>//<![CDATA[
    /* script */
//]]></script>


답변

어떤 이유로 XHTML을 사용하는 경우 XHTML 1.0 C 4 는 “스크립트에서 <또는 & 또는]]> 또는-를 사용하는 경우 외부 스크립트를 사용합니다. 즉, script요소 내부에 스크립트 코드를 삽입하지 말고 별도의 JavaScript 파일에 넣고 <script src="foo.js"></script>.


답변

Blogger의 누군가가 도착한 경우 BeautifyVSCode에서 확장 기능을 사용할 때이 문제가 발생 했습니다. 사용하지 마십시오 beautify.


답변