Nama entitas harus segera mengikuti '&' di referensi entitas

91

Saya ingin meletakkan game packman di halaman * .xhtml saya. (Saya menggunakan jsf 2 dan primefaces 3.5)

Namun,

ketika saya "menerjemahkan" halaman html dalam xhtml saya mendapatkan kesalahan di script ini:

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

Di baris:

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

saya mendapat:

Nama entitas harus segera mengikuti '&' di referensi entitas.

Tahu bagaimana cara memperbaikinya?

maximus
sumber

Jawaban:

219

Semua jawaban yang diposting sejauh ini memberikan solusi yang tepat, namun tidak ada jawaban yang dapat menjelaskan dengan tepat penyebab masalah konkret.

Facelet adalah teknologi tampilan berbasis XML yang menggunakan XHTML + XML untuk menghasilkan keluaran HTML. XML memiliki lima karakter khusus yang memiliki perlakuan khusus oleh parser XML:

  • < awal dari sebuah tag.
  • > akhir dari sebuah tag.
  • " awal dan akhir nilai atribut.
  • ' awal dan akhir alternatif dari nilai atribut.
  • &awal dari sebuah entitas (yang diakhiri dengan ;).

Dalam kasus &yang tidak diikuti oleh #(misalnya &#160;, &#xA0;, dll), XML parser secara implisit mencari salah satu dari lima nama entitas yang telah ditetapkan lt , gt, amp, quotdan apos, atau didefinisikan secara manual nama entitas . Namun, dalam kasus khusus Anda, Anda menggunakan &sebagai operator JavaScript, bukan sebagai entitas XML. Ini benar-benar menjelaskan kesalahan penguraian XML yang Anda dapatkan:

Nama entitas harus segera mengikuti '&' di referensi entitas

Intinya, Anda menulis kode JavaScript di tempat yang salah, dokumen XML, bukan file JS, jadi Anda harus meng-escape semua karakter khusus XML yang sesuai. The &harus lolos sebagai &amp;.

Jadi, dalam kasus khusus Anda, file

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

harus menjadi

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

untuk membuatnya valid XML.

Namun, ini membuat kode JavaScript lebih sulit untuk dibaca dan dipelihara. Seperti yang dinyatakan dalam dokumen luar biasa Mozilla Developer Network Menulis JavaScript untuk XHTML , Anda harus menempatkan kode JavaScript di blok data karakter (CDATA). Jadi, dalam istilah JSF, itu akan menjadi:

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

Pengurai XML akan menafsirkan konten blok sebagai data karakter "vanilla biasa" dan bukan sebagai XML dan karenanya menafsirkan karakter khusus XML "sebagaimana adanya".

Tapi, jauh lebih baik adalah dengan hanya meletakkan kode JS di file JS-nya sendiri yang Anda sertakan oleh <script src>, atau dalam istilah JSF, file <h:outputScript>.

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

(perhatikan target="body"; dengan cara ini JSF akan secara otomatis merender <script>di bagian paling akhir <body>, terlepas dari di mana <h:outputScript>lokasinya, dengan ini mencapai efek yang sama seperti dengan window.onloaddan $(document).ready(); jadi Anda tidak perlu menggunakannya lagi di skrip itu)

Dengan cara ini Anda tidak perlu khawatir tentang karakter khusus XML dalam kode JS Anda. Sebagai bonus tambahan, ini memberi Anda kesempatan untuk membiarkan browser menyimpan file JS sehingga ukuran respons total lebih kecil.

Lihat juga:

BalusC
sumber
Bukankah seharusnya! [CDATA [menjadi baris yang dikomentari? Hanya penasaran.
Nacho321
@ Nacho321: Hanya jika jenis konten salah disetel ke application/xhtml+xmlalih-alih text/html, yang pada gilirannya akan menyebabkan beberapa kegagalan di beberapa browser, terutama MSIE. Lihat juga dokumen "Menulis JavaScript untuk XHTML". Di JSF, Anda tidak perlu melakukannya jika menggunakan <f:view contentType="text/html">alih-alih membiarkan JSF / webbrowser menebak otomatis melakukan pekerjaannya. Lihat lebih lanjut juga stackoverflow.com/tags/xhtml/info
BalusC
CATATAN: Ini tidak hanya terjadi untuk operasi Javascipt (karena saya menggunakan dengan benar &amp;&amp;dalam baris pernyataan-jika di atas kesalahan saya), tetapi juga pada baris komentar; kesalahan saya adalah // TODO KevinC & Victor: some todo(sekarang diubah menjadi and..). Juga, terima kasih banyak atas postingan ini. Saya menemukannya sebelumnya sebagai perbaikan untuk masalah yang sama dengan OP.
Kevin Cruijssen
jawabanmu salah. itu harus & amp; alih-alih & amp; & amp;
funky-nd
1
@ funky-nd: Sepertinya Anda bingung dengan & amp; amp ;. Sekarang baca kembali jawabannya dengan mengingat hal ini.
BalusC
14

Anda perlu menambahkan tag CDATA di dalam tag skrip, kecuali jika Anda ingin membuka dan mengosongkan semua karakter XHTML secara manual (misalnya, &harus menjadi &amp;). Sebagai contoh:

<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>
cdhowie.dll
sumber
12

Pengurai mengharapkan beberapa konten HTML, sehingga dilihat &sebagai permulaan dari sebuah entitas, seperti &egrave;.

Gunakan solusi ini:

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

jadi Anda menentukan bahwa kode tersebut bukan teks HTML tetapi hanya data yang akan digunakan apa adanya.

Jacopofar
sumber
5

Melakukan

<script>//<![CDATA[
    /* script */
//]]></script>
Pil Ledakan
sumber
2

Jika Anda menggunakan XHTML, karena alasan tertentu, perhatikan bahwa XHTML 1.0 C 4 mengatakan: “Gunakan skrip eksternal jika skrip Anda menggunakan <atau & atau]]> atau -.” Artinya, jangan sematkan kode skrip di dalam scriptelemen tetapi letakkan ke dalam file JavaScript terpisah dan rujuk dengan <script src="foo.js"></script>.

Jukka K. Korpela
sumber
0

Seandainya seseorang dari Blogger datang, saya mengalami masalah ini saat menggunakan Beautifyekstensi di VSCode. Jangan gunakan, jangan beautify.

Fajar
sumber