ชื่อเอนทิตีต้องเป็นไปตาม "&" ในการอ้างอิงเอนทิตีทันที


92

ฉันต้องการใส่เกมแพ็คแมนในหน้า * .xhtml ของฉัน (ฉันใช้ jsf 2 และ primefaces 3.5)

อย่างไรก็ตาม

เมื่อฉัน "แปล" หน้า html ใน xhtml ฉันได้รับข้อผิดพลาดที่สคริปต์นี้:

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

ฉันเข้าใจ:

ชื่อเอนทิตีต้องเป็นไปตาม "&" ในการอ้างอิงเอนทิตีทันที

มีความคิดอย่างไรที่จะแก้ไข?

คำตอบ:


220

คำตอบทั้งหมดที่โพสต์จนถึงตอนนี้กำลังให้คำตอบที่ถูกต้องอย่างไรก็ตามไม่มีคำตอบใดที่สามารถอธิบายสาเหตุพื้นฐานของปัญหาที่เป็นรูปธรรมได้อย่างถูกต้อง

Facelets เป็นเทคโนโลยีมุมมองตาม XML ซึ่งใช้ XHTML + XML เพื่อสร้างเอาต์พุต HTML XML มีอักขระพิเศษห้าตัวซึ่งมีการปฏิบัติพิเศษโดยตัวแยกวิเคราะห์ XML:

  • < จุดเริ่มต้นของแท็ก
  • > จุดสิ้นสุดของแท็ก
  • " จุดเริ่มต้นและจุดสิ้นสุดของค่าแอตทริบิวต์
  • ' ทางเลือกเริ่มต้นและสิ้นสุดของค่าแอตทริบิวต์
  • &จุดเริ่มต้นของเอนทิตี (ซึ่งลงท้ายด้วย;)

ในกรณีของการ&ที่ไม่ได้ตามมาด้วย#(เช่น&#160;, &#xA0;ฯลฯ ) parser XML ไม่ปริยายมองหาหนึ่งในห้าชื่อนิติบุคคลที่กำหนดไว้ล่วงหน้า lt , gt, amp, quotและapos, หรือชื่อนิติบุคคลที่กำหนดไว้ด้วยตนเอง อย่างไรก็ตามในกรณีเฉพาะของคุณคุณใช้&เป็นตัวดำเนินการ JavaScript ไม่ใช่เอนทิตี XML สิ่งนี้อธิบายถึงข้อผิดพลาดในการแยกวิเคราะห์ XML ที่คุณได้รับ:

ชื่อเอนทิตีต้องเป็นไปตาม "&" ในการอ้างอิงเอนทิตีทันที

โดยพื้นฐานแล้วคุณกำลังเขียนโค้ด JavaScript ผิดตำแหน่งเป็นเอกสาร XML แทนที่จะเป็นไฟล์ JS ดังนั้นคุณควรหลีกเลี่ยงอักขระพิเศษ XML ทั้งหมดตามนั้น จะต้องหนีออกมาเป็น&&amp;

ดังนั้นในกรณีเฉพาะของคุณไฟล์

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

จะต้องกลายเป็น

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

เพื่อให้เป็น XML ที่ถูกต้อง

อย่างไรก็ตามสิ่งนี้ทำให้โค้ด JavaScript อ่านและดูแลรักษายากขึ้น ตามที่ระบุไว้ในเอกสารที่ยอดเยี่ยมของ Mozilla Developer Network การเขียน JavaScript สำหรับ XHTMLคุณควรวางโค้ด JavaScript ในบล็อกข้อมูลอักขระ (CDATA) ดังนั้นในเงื่อนไข JSF นั่นจะเป็น:

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

ตัวแยกวิเคราะห์ XML จะตีความเนื้อหาของบล็อกเป็นข้อมูลอักขระ "วานิลลาธรรมดา" และไม่ใช่เป็น 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()ดังนั้นคุณไม่จำเป็นต้องใช้เหล่านั้นอีกต่อไปในบทที่)

วิธีนี้ทำให้คุณไม่ต้องกังวลเกี่ยวกับอักขระพิเศษ XML ในโค้ด JS ของคุณ เป็นโบนัสเพิ่มเติมสิ่งนี้เปิดโอกาสให้คุณปล่อยให้เบราว์เซอร์แคชไฟล์ JS เพื่อให้ขนาดการตอบสนองทั้งหมดเล็กลง

ดูสิ่งนี้ด้วย:


ไม่ควร! [CDATA [เป็นแนวแสดงความคิดเห็น? แค่สงสัย.
Nacho321

@ Nacho321: เฉพาะในกรณีที่ประเภทเนื้อหาถูกตั้งค่าผิดเป็นapplication/xhtml+xmlแทนที่จะเป็นtext/htmlซึ่งจะทำให้เกิดความล้มเหลวหลายอย่างในเบราว์เซอร์บางตัวโดยส่วนใหญ่เป็น MSIE โปรดดูเอกสาร "การเขียน JavaScript สำหรับ XHTML" ใน JSF คุณไม่จำเป็นต้องใช้<f:view contentType="text/html">แทนการปล่อยให้ JSF / เว็บเบราว์เซอร์เดาอัตโนมัติทำงาน ดูเพิ่มเติมstackoverflow.com/tags/xhtml/info
BalusC

หมายเหตุ: สิ่งนี้ไม่ได้เกิดขึ้นเฉพาะกับการดำเนินการ Javascipt เท่านั้น (เนื่องจากฉันใช้อย่างถูกต้อง&amp;&amp;ใน if-statement หนึ่งบรรทัดเหนือข้อผิดพลาดของฉัน) แต่ยังอยู่ในบรรทัดความคิดเห็นด้วย ข้อผิดพลาดของฉันเปิดอยู่// TODO KevinC & Victor: some todo(ตอนนี้เปลี่ยนเป็นand.. ) นอกจากนี้ขอบคุณมากสำหรับโพสต์นี้ ฉันเจอมาก่อนเพื่อแก้ไขปัญหาเดียวกับ OP
Kevin Cruijssen

คำตอบของคุณผิด มันควรจะเป็น & amp; แทนที่จะเป็น & amp; & amp;
funky-nd

1
@ funky-nd: ฉันเดาว่าคุณสับสนกับ & amp; amp; ตอนนี้อ่านคำตอบอีกครั้งโดยคำนึงถึงสิ่งนี้
BalusC

14

คุณต้องเพิ่มแท็ก CDATA ภายในแท็กสคริปต์เว้นแต่คุณต้องการผ่านและหลีกเลี่ยงอักขระ XHTML ทั้งหมดด้วยตนเอง (เช่น&จะต้องกลายเป็น&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 มาถึงฉันมีปัญหานี้เมื่อใช้Beautifyส่วนขยายใน VSCode อย่าใช้มันห้ามbeautifyมัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.