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


91

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

나는 얻다:

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

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

답변:


219

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

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 파일을 캐시하여 총 응답 크기를 줄일 수 있습니다.

또한보십시오:


! [CDATA [는 주석 처리 된 줄이어야하지 않습니까? 그냥 궁금해.
Nacho321 2013-08-26

@ Nacho321 : 콘텐츠 유형이 application/xhtml+xml대신으로 잘못 설정 text/html되어 일부 브라우저 (주로 MSIE)에서 여러 오류가 발생하는 경우에만 가능합니다 . "XHTML 용 JavaScript 작성"문서를 참조하십시오. JSF에서는 JSF <f:view contentType="text/html">/ 웹 브라우저 자동 추측이 작업을 수행하도록 하는 대신 사용할 필요가 없습니다 . 추가 참조 stackoverflow.com/tags/xhtml/info
BalusC 2013 년

참고 : 이는 Javascipt 작업 ( &amp;&amp;내 오류 위의 if 문 한 줄에서 올바르게 사용하기 때문에 )뿐만 아니라 주석 줄에서도 발생합니다. 내 오류가 발생했습니다 // TODO KevinC & Victor: some todo(이제 and..로 변경됨 ). 또한이 게시물에 감사드립니다. 나는 OP와 같은 문제에 대한 수정으로 전에 그것을 보았습니다.
Kevin Cruijssen

당신의 대답은 틀 렸습니다. & amp; & amp; & amp;
funky-nd

1
@ funky-nd : & amp; amp;와 혼동하신 것 같습니다. 이제이를 염두에두고 답을 다시 읽으십시오.
BalusC

14

수동으로 통과하고 모든 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>

12

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

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

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

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



2

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


0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.