Имя сущности должно немедленно следовать за ' & ' в ссылке на сущность
Я хочу поставить игру 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 ответов:
все ответы, опубликованные до сих пор, дают правильные решения, однако ни один ответ не смог правильно объяснить основную причину конкретной проблемы.
Facelets - это технология представления на основе XML, которая использует XHTML+XML для создания вывода HTML. XML имеет пять специальных символов, которые имеют специальную обработку синтаксическим анализатором XML:
<
начало тега.>
- конец тега."
пуск и конец значения атрибута.'
альтернативное начало и конец значения атрибута.&
начало сущности (которая заканчивается;
).в случае
&
за которым не следует#
(например, 
, 
и т. д.), синтаксический анализатор XML неявно ищет один из пяти предопределенные имена сущностейlt
,gt
,amp
,quot
иapos
, или любое определенными вручную имя сущности. Однако в вашем конкретном случае вы использовали&
как оператор JavaScript, а не как объект XML. Это полностью объясняет ошибку синтаксического анализа XML, которую вы получили:имя сущности должно немедленно следовать за ' & ' в ссылке на сущность
по сути, вы пишете код JavaScript в неправильном месте, XML-документ вместо JS-файла, поэтому вы должны избегать всех специальных символов XML соответственно. Элемент
&
должен быть сбежал как&
.Итак, в вашем конкретном случае
if (Modernizr.canvas && Modernizr.localstorage &&
должны стать
if (Modernizr.canvas && Modernizr.localstorage &&
чтобы сделать его 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 (например,
&
должны быть&
). Например:<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, поэтому он видит
&
как начало сущности, какè
.используйте этот обходной путь:
<script type="text/javascript"> // <![CDATA[ Javascript code here // ]]> </script>
таким образом, вы указываете, что код-это не текст HTML, а просто данные, которые будут использоваться как есть.
Если вы используете XHTML, по какой-то причине, обратите внимание, что XHTML 1.0 C 4 говорит: "используйте внешние скрипты, если ваш скрипт использует или --."То есть, не вставляйте код скрипта в
script
элемент, но поместите его в отдельный файл JavaScript и обратитесь к нему с помощью<script src="foo.js"></script>
.