* .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 개의 특수 문자가 있습니다.
<
태그의 시작.>
태그의 끝."
속성 값의 시작과 끝.'
속성 값의 대체 시작 및 끝.&
엔티티의 시작 (로 끝나는;
).
경우의 &
하는 따르지 #
(예를 들면  
,  
등), XML 파서는 암시 적으로 다섯 가지 중 하나를 찾고 미리 정의 된 개체 이름 lt
, gt
, amp
, quot
및 apos
, 또는 수동으로 정의 된 엔티티 이름 . 그러나 특정 경우 &
에는 XML 엔티티가 아닌 JavaScript 연산자 로 사용 했습니다. 이것은 XML 구문 분석 오류를 완전히 설명합니다.
엔티티 이름은 엔티티 참조에서 ‘&’바로 뒤에 와야합니다.
본질적으로, JS 파일 대신 XML 문서 인 잘못된 위치에 JavaScript 코드를 작성하고 있으므로 이에 따라 모든 XML 특수 문자를 이스케이프해야합니다. &
로 이스케이프해야합니다 &
.
따라서 귀하의 특정 경우에는
if (Modernizr.canvas && Modernizr.localstorage &&
되어야한다
if (Modernizr.canvas && Modernizr.localstorage &&
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 태그 내부를 추가해야 &
될 필요가있을 것이다 &
). 예를 들면 :
<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 콘텐츠를 예상하고 있으므로 &
엔티티의 시작으로 같은 è
.
이 해결 방법을 사용하십시오.
<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의 누군가가 도착한 경우 Beautify
VSCode에서 확장 기능을 사용할 때이 문제가 발생 했습니다. 사용하지 마십시오 beautify
.