javascript - tag - title of page html
Error al analizar XHTML: el contenido de los elementos debe consistir en datos de caracteres bien formados o marcado (4)
Como una extensión de esta question , estoy tratando de insertar Javascript en la propiedad onclick
un <h:commandButton />
ya que la action
ya está representando una tabla ajax.
Lo que quiero hacer: obtener los elementos seleccionados en un cuadro de lista y convertirlos en parámetros para usarlos en un FileServlet
JSF. es decir, para2=value1¶m=value2¶m=value3
Esto es lo que tengo:
<script type ="text/javascript">
function myScript() {
var box = document.getElementbyId(''myForm:box'');
var length = box.options.length;
var paramstring = "";
for (var i = 0; i < length; i++) {
if (i != (length - 1) {
if (box.options[i].selected) {
paramstring = paramstring + "param=" + box.options[i].value + "&";
}
} else {
paramstring = paramstring + "param=" + box.options[i].value;
}
}
if (document.getElementById(''myForm:checkbox'').checked) {
window.location=''fileServlet? + paramstring;
}
}
</script>
Lo que obtengo cuando se carga la página: javax.servlet.ServletException: Error Parsing /page.xhtml: Error Traced[line:15] The content of elements must consist of well-formed character data or markup.
Lo que no desencadena la excepción:
<script type ="text/javascript">
function myScript() {
var box = document.getElementbyId(''myForm:box'');
var length = box.options.length;
var paramstring = "";
if (document.getElementById(''myForm:checkbox'').checked) {
window.location=''fileServlet? + paramstring;
}
}
</script>
Tan pronto como agregue for (var i = 0; i < length; i++)
o incluso for (var i = 0; i < 10; i++)
la página no se cargará. ¿Por qué no le gusta el bucle for?
A veces necesitarás esto:
/*<![CDATA[*/
/*]]>*/
y no solo esto:
<![CDATA[
]]>
Facelets es una tecnología de visualización basada en XML que utiliza XHTML + XML para generar resultados HTML. XML tiene cinco caracteres especiales que tienen un tratamiento especial por el analizador XML:
-
<
el comienzo de una etiqueta. -
>
el final de una etiqueta. -
"
el inicio y el final de un valor de atributo". -
''
el inicio y el final alternativos de un valor de atributo. -
&
el comienzo de una entidad (que termina con;
).
En el caso de <
, el analizador XML busca implícitamente el nombre de la etiqueta y la etiqueta final >
. Sin embargo, en su caso particular, estaba usando <
como un operador de JavaScript, no como una entidad XML. Esto explica totalmente el error de análisis XML que obtuviste:
El contenido de los elementos debe consistir en datos de caracteres bien formados o marcado.
Básicamente, está escribiendo código JavaScript en el lugar equivocado, un documento XML en lugar de un archivo JS, por lo que debería escaparse de todos los caracteres especiales XML en consecuencia. El <
debe ser escapado como <
.
Entonces, esencialmente, el
for (var i = 0; i < length; i++) {
debe convertirse
for (var i = 0; i < length; i++) {
para que sea XML-válido.
Sin embargo, esto hace que el código de JavaScript sea más difícil de leer y mantener. Como se indica en el excelente documento de JavaScript de la Red de Desarrolladores de Mozilla para XHTML , debe colocar el código JavaScript en un bloque de datos de caracteres (CDATA). Por lo tanto, en términos JSF, eso sería:
<h:outputScript>
<![CDATA[
// ...
]]>
</h:outputScript>
El analizador XML interpretará los contenidos del bloque como datos de caracteres "simples" y no como XML y, por lo tanto, interpretará los caracteres especiales XML "tal como están".
Pero, mucho mejor es simplemente poner el código JS en su propio archivo JS que incluye por <script src>
, o en términos JSF, el <h:outputScript>
.
<h:outputScript name="functions.js" target="head" />
De esta forma, no necesita preocuparse por los caracteres XML especiales en su código JS.
Ver también:
Me encontré con esta publicación hoy porque me encontré con el mismo problema y tuve el mismo problema de que el javascript no se ejecuta con las etiquetas CDATA mencionadas anteriormente. Corregí las etiquetas CDATA para que se vean así:
<script type="text/javascript">
//<![CDATA[
your javascript code here
//]]>
</script>
¡Entonces todo funcionó a la perfección!
Resolví esto convirtiendo el JSP de XHTML a HTML, haciendo esto al principio:
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
...