Varlık adı, varlık referansındaki "&" işaretinin hemen ardından gelmelidir


91

* .Xhtml sayfama bir packman oyunu koymak istiyorum. (Jsf 2 ve primefaces 3.5 kullanıyorum)

Ancak,

html sayfasını xhtml'de "çevirdiğimde" bu komut dosyasında bir hata alıyorum:

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

Çizgide:

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

alırım:

Varlık adı, varlık referansındaki "&" işaretinin hemen ardından gelmelidir.

Bunu nasıl düzelteceğine dair bir fikrin var mı?

Yanıtlar:


219

Şimdiye kadar gönderilen tüm cevaplar doğru çözümleri veriyor, ancak somut sorunun altında yatan nedeni doğru bir şekilde açıklayamayan kimse yoktu.

Facelets, HTML çıktısı oluşturmak için XHTML + XML kullanan XML tabanlı bir görünüm teknolojisidir. XML, XML ayrıştırıcı tarafından özel olarak ele alınan beş özel karaktere sahiptir:

  • < bir etiketin başlangıcı.
  • > bir etiketin sonu.
  • " bir öznitelik değerinin başlangıcı ve bitişi.
  • ' bir öznitelik değerinin alternatif başlangıcı ve bitişi.
  • &bir varlığın başlangıcı (ile biten ;).

Durumunda arasında &hangi takip etmiyorsa #(örneğin &#160;, &#xA0;vs.), XML ayrıştırıcı örtülü beş birinin aradığı önceden tanımlanmış varlık adlarını lt , gt, amp, quotve apos, veya herhangi bir elle tanımlanan varlık adı . Ancak, sizin özel durumunuzda, &bir XML varlığı olarak değil, bir JavaScript operatörü olarak kullanıyordunuz . Bu, aldığınız XML ayrıştırma hatasını tamamen açıklar:

Varlık adı, varlık referansındaki "&" işaretinin hemen ardından gelmelidir

Özünde, JavaScript kodunu yanlış yere, JS dosyası yerine bir XML belgesine yazıyorsunuz, bu nedenle tüm XML özel karakterlerinden uygun şekilde kaçmalısınız. Olarak &kaçılmalıdır &amp;.

Yani, sizin özel durumunuzda,

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

olmalı

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

XML için geçerli hale getirmek için.

Ancak bu, JavaScript kodunun okunmasını ve bakımını zorlaştırır. Mozilla Developer Network'ün mükemmel XHTML için JavaScript Yazma belgesinde belirtildiği gibi, JavaScript kodunu bir karakter verisi (CDATA) bloğuna yerleştirmelisiniz. Bu nedenle, JSF açısından, bu şöyle olacaktır:

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

XML ayrıştırıcı bloğun içeriğini XML olarak değil, "düz vanilya" karakter verisi olarak yorumlayacak ve dolayısıyla XML özel karakterlerini "olduğu gibi" yorumlayacaktır.

Ama, çok daha iyi sadece tarafından dahil kendi JS dosyasına JS kodu koymaktır <script src>, MTU açısından <h:outputScript>.

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

( target="body"Bu şekilde; JSF'nin nerede bulunduğuna bakılmaksızın <script>, en sonunda otomatik olarak işleyeceğini ve böylece ve ile aynı etkiyi elde edeceğini unutmayın; böylece bunları artık o komut dosyasında kullanmanız gerekmez)<body><h:outputScript>window.onload$(document).ready()

Bu şekilde, JS kodunuzdaki XML-özel karakterler için endişelenmenize gerek kalmaz. Ek bir bonus olarak, bu size tarayıcının JS dosyasını önbelleğe almasına izin verir, böylece toplam yanıt boyutu daha küçük olur.

Ayrıca bakınız:


! [CDATA [yorumlu bir satır olmamalı mı? Sadece merak.
Nacho321

@ Nacho321: Yalnızca içerik türü application/xhtml+xmlyerine yanlış ayarlanmışsa text/html, bu da bazı tarayıcılarda, özellikle MSIE'de birkaç hataya neden olur. Ayrıca "XHTML için JavaScript Yazma" belgesine bakın. JSF'de, işi <f:view contentType="text/html">JSF / webbrowser otomatik tahmin etmesine izin vermek yerine kullanıyorsanız bunu yapmanız gerekmez. Daha fazla bilgi için stackoverflow.com/tags/xhtml/info
BalusC

NOT: Bu sadece Javascipt işlemleri için değil ( &amp;&amp;bir if-ifadesinde hatamın bir satır üzerinde doğru şekilde kullandığım için), aynı zamanda yorum satırında da meydana gelir; hatam açıktı // TODO KevinC & Victor: some todo(şimdi and.. olarak değiştirildi ). Ayrıca, bu gönderi için çok teşekkürler. Daha önce OP ile aynı sorunun çözümü olarak karşılaştım.
Kevin Cruijssen

cevabın yanlış & amp; & amp; & amp; yerine
funky-nd

1
@ funky-nd: Sanırım onu ​​& amp; ile karıştırdınız. Şimdi bunu aklınızda tutarak cevabı yeniden okuyun.
BalusC

14

Tüm XHTML karakterlerini manuel olarak gözden geçirmek ve bunlardan kaçınmak istemiyorsanız (örneğin &olması gerekir &amp;) , komut dosyası etiketinin içine bir CDATA etiketi eklemeniz gerekir . Örneğin:

<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

Ayrıştırıcı bir miktar HTML içeriği beklediğinden &, gibi bir varlığın başlangıcı olarak görür &egrave;.

Bu geçici çözümü kullanın:

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

bu nedenle kodun HTML metni olmadığını, yalnızca olduğu gibi kullanılacak veri olduğunu belirtirsiniz.



2

XHTML kullanıyorsanız, herhangi bir nedenle, XHTML 1.0 C 4'ün şunu söylediğine dikkat edin : "Komut dosyanız <veya & veya]]> veya - kullanıyorsa harici komut dosyaları kullanın." Yani, komut dosyası kodunu bir scriptöğenin içine yerleştirmeyin, onu ayrı bir JavaScript dosyasına koyun ve ile ona bakın <script src="foo.js"></script>.


0

Blogger'dan birinin gelmesi durumunda Beautify, VSCode'da uzantıyı kullanırken bu sorunu yaşadım. Onu kullanma, yapma beautify.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.