Имя сущности должно немедленно следовать за ' & ' в ссылке на сущность


Я хочу поставить игру packman на мой *.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 && 

Я:

имя сущности должно сразу следовать за ' & ' в сущности ссылка.

есть идеи, как это исправить?

5 63

5 ответов:

все ответы, опубликованные до сих пор, дают правильные решения, однако ни один ответ не смог правильно объяснить основную причину конкретной проблемы.

Facelets - это технология представления на основе XML, которая использует XHTML+XML для создания вывода HTML. XML имеет пять специальных символов, которые имеют специальную обработку синтаксическим анализатором XML:

  • < начало тега.
  • > - конец тега.
  • " пуск и конец значения атрибута.
  • ' альтернативное начало и конец значения атрибута.
  • & начало сущности (которая заканчивается ;).

в случае & за которым не следует # (например,&#160;,&#xA0; и т. д.), синтаксический анализатор 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 внутри тега сценария, если вы не хотите вручную пройти и избежать всех символов 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>

парсер ожидает некоторое содержимое HTML, поэтому он видит & как начало сущности, как &egrave;.

используйте этот обходной путь:

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

таким образом, вы указываете, что код-это не текст HTML, а просто данные, которые будут использоваться как есть.

Do

<script>//<![CDATA[
    /* script */
//]]></script>

Если вы используете XHTML, по какой-то причине, обратите внимание, что XHTML 1.0 C 4 говорит: "используйте внешние скрипты, если ваш скрипт использует или --."То есть, не вставляйте код скрипта в script элемент, но поместите его в отдельный файл JavaScript и обратитесь к нему с помощью <script src="foo.js"></script>.