2009-10-21 22 views
5

Considere esto:Diferencia en jQuery con el espacio de nombres XML y xhr.responseXML entre Opera y Firefox

<!DOCTYPE HTML> 
<html><head><title>XML-problem</title> 

<script src="jquery-1.3.2.min.js" type="text/javascript"></script> 

<script type="text/javascript"> 

$(function() { 
    $('<p/>').load("text.xml", function(responseText, textStatus, xhr) { 
     var xml = $(xhr.responseXML); 
     var x_txt = xml.find('atom\\:x').text(); 
     $(this).text(x_txt).appendTo('#container'); 
    }); 
}); 

</script> 

</head><body><div id="container" /></body></html> 

Este script debe cargar text.xml cuando el documento se ha cargado. text.xml se ve así:

<xml xmlns:atom="http://www.w3.org/2005/Atom"> 
    <atom:x>Text</atom:x> 
</xml> 

Cuando este archivo se ha cargado, el contenido del texto de la atom:x -node se adjuntan al documento. Puedo ver "Texto" en la ventana de mi navegador.

Esto funciona como se esperaba en Firefox. Sin embargo, no funciona en Opera a menos que cambie la consulta de 'atom\\:x' a solo 'x'. En este caso, funciona en Opera, pero no en Firefox.

He descubierto una solución, es decir, cambiar la consulta a 'atom\\:x, x', pero me gustaría llegar al final de esto.


Ahora para el toque divertido: Puedo inline el código XML directamente en lugar de obtenerlo de XHR cambiando

var xml = $(xhr.responseXML); 

en

var xml = $('<xml xmlns:atom="http://www.w3.org/2005/Atom"><atom:x>Text</atom:x></xml>'); 

En este caso, una consulta de 'atom\\:x' se dar el resultado deseado en ambos navegadores y solo 'x' no dará resultado en ambos buscadores.

El hecho de que esto funcione de manera diferente en Opera me lleva a la conclusión de que el comportamiento anterior es un error en Opera. ¿Es esta una conclusión razonable? ¿Dónde puedo señalar el estándar que describe cómo se supone que funciona?


En conclusión:

  1. ¿Cuáles son las soluciones temporales alternativas para este problema? ¿Alguno mejor que el que he encontrado?
  2. ¿Este es un error en Opera? Si es así, ¿qué estándar dice eso?

espera que usted pueda ayudar :)

+2

Parece un error conocido. http://thompson-web.blogspot.com/2009/03/jquery-xml-and-namespaces.html http://dev.jquery.com/ticket/155 –

+1

@Stefan: Por lo tanto, debe jQuery dame resultados cuando solo consultes 'x', sin importar el navegador? –

+0

¿Por qué está usando 'load'? La carga debe ser para html, no xml. ¿Funciona con 'ajax' o' get'? – Kobi

Respuesta

1

Creo que debería decir "átomo: x" (sin las barras invertidas), y asegúrese de tener los xmlns: átomo = "http: //www.w3 .org/2005/Atom "declaración en la etiqueta html en el archivo html principal, o de alguna otra manera conocida por el javascript.

+1

Eso * no * funcionará. el colon es un personaje especial en jquery y debe ser escapado. –

0

Es difícil decir si esto es un error en la opera o si esto es un error en jQuery que es específico de Opera. Por lo que dice, Opera no está agregando correctamente el espacio de nombres al documento xhr dom y es por eso que jQuery no puede consultar átomo: x y también explica por qué, cuando creas tu propio nodo jquery, no obtienes los mismos resultados.

Lo primero que haría es intentar y ver si el átomo es un namspace definido en la xhr dom. Debería devolver sus átomos como se define, de lo contrario, esto es probablemente un error de la ópera. No estoy seguro de la mejor manera de probar esto, pero quizás: xhr.getElementByTagNameNS("x" "http://www.w3.org/2005/Atom"); funcionará.

En su defecto, Opera afirma que es compatible con XML namespaces, sin embargo, así que abriría una solicitud de error con jQuery y vería dónde está usted.

En otros puntos, como eludí en mi comentario, no creo que consultar atom:x por es una buena idea. También puede no utilizar espacios de nombres, ya que se frustra el propósito.

+0

Gracias por los consejos. Desafortunadamente, no podré probarlo de inmediato ... Regresaré contigo. –

2

Ya he experimentado este comportamiento en diferentes versiones del mismo navegador y, por lo que recuerdo, en el momento en que estaba probando la página problemática con FF e IE, entonces diría que no es un error específico de Opera. .

Sugeriría que siempre que utilice jQuery para analizar etiquetas XML con prefijos de espacio de nombres, consulte el selector con y sin el prefijo. Es decir, en lugar de utilizar

var x_txt = xml.find('atom\\:x').text(); 

tratar

var x_txt = xml.find('atom\\:x, x').text(); 

Creo que esta es una solución aceptable para la mayoría de las situaciones y se asegurará de que sus resultados son correctos a pesar de las malas conductas ...

3

No es un error en Opera. Es the correct behavior:

En un cliente de espacio de nombres en cuenta, la parte del nombre de los selectores de tipo de elemento (la parte después del separador de espacio de nombres, si está presente) sólo igualará contra la parte local del nombre completo del elemento.

En su caso nombre local es x y atom:xisn't even a legal local name in XML.

Por otra parte, en namespace-prefixed type selector CSS tiene una sintaxis diferente que no utiliza en absoluto de colon:

@namespace atom url(http://www.w3.org/2005/Atom); 
atom|x { color: blue } 

Su sintaxis parece basarse en una peculiaridad introducido por los analizadores HTML en los agentes de usuario de espacio de nombres-conscientes.

analizador de HTML "come" el colon como parte del nombre de la etiqueta y se obtiene atom:x elemento de espacio de nombres por defecto, lo que se correspondería con atom\:x selector, pero en XML que se obtiene x elemento en http://www.w3.org/2005/Atom espacio de nombres.

Cuestiones relacionadas