지금까지 게시 된 모든 답변이 올바른 해결책을 제시하고 있지만 구체적인 문제의 근본 원인을 제대로 설명 할 수있는 답변은 없었습니다.
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 파일을 캐시하여 총 응답 크기를 줄일 수 있습니다.
또한보십시오: