Foros del Web » Programando para Internet » Javascript » Frameworks JS »

destripar objeto Ajax

Estas en el tema de destripar objeto Ajax en el foro de Frameworks JS en Foros del Web. Hola: Siempre he pensado que conociendo los subobjetos de los objetos, se puede aprender algo más de los comportamientod de cada navegador y como implementan ...
  #1 (permalink)  
Antiguo 22/09/2008, 03:30
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
destripar objeto Ajax

Hola:

Siempre he pensado que conociendo los subobjetos de los objetos, se puede aprender algo más de los comportamientod de cada navegador y como implementan eso mismo: los objetos.
Basándome en el destripador, acabo de subir esta página: Destripando objetos Ajax, mostrando cada elemento de los objetos ajax en cada uno de los cambios de estado (onreadystatechange)

La idea de este mensaje es sacar conclusiones sobre los objetos ajax, sus atributos y subobjetos (vaya la redundancia), y también ver la mejor forma de implementar rutinas para encontrar esos datos.

Por ahora, un primer problema es no poder destripar el objeto responseXML con ie7, que creo que es el objeto más importante para desglosar, ya que es una de las mejores formas de obtener la información requerida.

Sobre responseText (objeto string), he notado que no hace falta esperar al "readystate 4", ya que en el estado 3 ya está accesible.

Siguiendo con responseXML, se puede crear un árbol DOM, buscando los nodos (desde el array childNodes) con nodeType=1 (tags), se puede obtener cada nombre y valor (nodeName y nodeValue) de cada etiqueta, además de obtenerse sus childNodes pudiendose hacer un recorrido recursivo.
Otra cosa que me pareció interesante es que esos tags también tienen su array de attributes, pudiendose guardar datos en esos mismos atributos, siendo de esa manera innecesaria un anidamiento de tags con un solo valor asociado.

A medida que vaya encontrando (o recordando) conclusiones las iré comentando...

Sobre el código js lo inserto con un include php, y se puede ver en este enlace: ajax.js, si alguien quiere aportar alguna mejora, será bienvenida, y si alguna cosa no se entiende, no tendré problemas en comentarlo.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #2 (permalink)  
Antiguo 22/09/2008, 04:55
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 10 meses
Puntos: 834
Respuesta: destripar objeto Ajax

Simplemente, genial!!! (Lastima que deba esparcir karma a otros antes de volver a dártelo)
  #3 (permalink)  
Antiguo 22/09/2008, 05:27
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: destripar objeto Ajax

Cita:
Iniciado por Panino5001 Ver Mensaje
Simplemente, genial!!! (Lastima que deba esparcir karma a otros antes de volver a dártelo)
¡Je, je! A mi me pasa lo mismo (y también con otros ilustres que se lo merecen)...

Estaba seguro que te ibas a interesar en el tema (¡te conozco!... ), y creo que eres de los que aportan cosas interesantes... espero que así sea (amén).

aprovecho para comentar un poco más sobre el código... nunca me ha gustado el método eval, y estoy convencido de que no es necesario en la mayoría de los casos que se usa, y un caso en el que se suele usar es obtener objetos a partir de cadena, por eso el caso de el método objetando...

Código:
function objetando(objeto_base, subs)	{
	if (subs.indexOf("_") == -1)	return objeto_base[subs];
	else	return objetando(objeto_base[subs.substr(0, subs.indexOf("_"))], subs.substr(subs.indexOf("_") + 1));
}
Se trata de un objeto que recibe un objeto y una cadena con los subobjetos separados por el carácter "_" (guión bajo), y devuelve el objeto resultante... lo mismo se obtendría empezando con window, y los subobjetos unidos por el carácter "." punto con el método eval (en el método se conseguiría lo mismo reemplazando el guión por un punto).

Creo que el uso de la recursión es una cosa interesante.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #4 (permalink)  
Antiguo 22/09/2008, 11:45
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: destripar objeto Ajax

Muy bueno caricatos, es muy interesante, esperemos que esto inspire a los demas a aprender todo lo que pueden hacer via AJAX.
  #5 (permalink)  
Antiguo 22/09/2008, 15:57
Avatar de jseros  
Fecha de Ingreso: agosto-2008
Ubicación: Bogotá
Mensajes: 218
Antigüedad: 15 años, 8 meses
Puntos: 18
Respuesta: destripar objeto Ajax

Sin comentarios. Realmente sensacional.
  #6 (permalink)  
Antiguo 26/09/2008, 02:06
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: destripar objeto Ajax

Hola:

Con las primeras conclusiones, me puse a retocar una página que tengo para administrar una galería de imágenes con comentarios, y en ella implementé un sistema de búsqueda paginada, generando el listado con un formato así:

Código:
<listado>
<item id="1" url="imagen1.gif" comentario="comentario de item 1" />
<item id="2" url="imagen2.gif" comentario="comentario de item 2" />
...
<item id="n" url="imagenn.gif" comentario="comentario de item n" />
</listado>
... y me dió un resultado buenísimo en las primeras consultas, pero en alguno de los campos había un carácter suelto "&", que no está permitido en los documentos xml (debe ser "&amp;"), cosa que me fastidió bastante.
La solución, rápida y muy chapucera, fué con el reemplazo de las coincidencias en el server (ereg_replace()... )
La verdad es que pensé usar otras cosas como htmlspecialschars o htmlentities, o addslashes, pero luego en local se decodificaban mal tanto con unescape como con decodeURI... creo que es una buena pregunta para hacer.
Otra alternativa sería crear también el doctype (tal vez en la misma respuesta...)

Añadí a la página un nuevo botón con la misma respuesta pero añadiéndole una línea que provoca error.

Código:
<error provocado_por="&">para más inrri "&"</error>
Y en el listado obtenido con ff, en el objeto: Ajax.responseXML.childNodes.0.childNodes.0 se obtiene:
Código:
Error de parseo XML: malformado
Lugar: http://www.caricatos.net/DOM/error_provocado.xml
Línea 43, Columna 25:
También se nota en la consola de errores:

Código:
Error: malformado
Archivo Fuente: http://www.caricatos.net/DOM/error_provocado.xml
Línea: 43, Columna: 25
Código Fuente:
 <error provocado_por="&">para más inrri "&"</error>
Ahora se me ocurre otra cuestión... Si bien xml es más estructurado y siempre he pensado que para implementar listados es la mejor opción, pero si se hiciese con responseText, ¿qué gasto añadido en la implementación se haría (tanto en el servidor como en código javascript)?

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #7 (permalink)  
Antiguo 27/09/2008, 10:13
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años
Puntos: 35
Respuesta: destripar objeto Ajax

loading........

bueno los atributos deberian tener htmlentities y el contenido de un nodo estar entre CDATA para evitar errores.

Cita:
Por ahora, un primer problema es no poder destripar el objeto responseXML con ie7, que creo que es el objeto más importante para desglosar, ya que es una de las mejores formas de obtener la información requerida.
Que errores tienes?

Voy a explorar el código para ver en que puedo ayudar ;)

Respecto a IE.. si usas directamente "childNodes" de un TAG. seguramente te saltan errores porque a los TAGS de tipo "#text" y "#comment" no se puede acceder a ese método/propiedad... simplemente salta ERROR en IE. asi que.. al momento de hacer una busqueda recursiva con "childNodes" añadas un filtro en "nodeName" para excluir a los elementos de tipo "#text" y "#comment".

Tambien añadir que los XML que tienen un "\n" son tomados como NODOS en el XMLParser de IE.


connection closed.
__________________

Maborak Technologies
  #8 (permalink)  
Antiguo 27/09/2008, 11:18
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: destripar objeto Ajax

Hola:

¡Qué tal MaBoRaK!... Sabía que te interesarías por el tema

Bueno, los nombres de los atributos normalmente son correctos, pero sus valores pueden tener caracteres especiales que pueden dar problemas... y creo que con htmlentities ya lo probé (de todos modos lo probaré nuevamente)... y lo de CDATA creo que lo vi por alguna parte... veré que hacer...

El error en ie lo provoca el bucle for, y los valores obtenidos los filtro con un try/catch...

Lo de los contenidos "\n" ya lo sabía del otro destripador, pero son solo conclusiones lo qiue busco.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #9 (permalink)  
Antiguo 06/10/2008, 02:57
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: destripar objeto Ajax

Hola:

Ya he visto lo de htmlentities y CDATA, y puse unos arreglos en la página, donde también me preocupé de la estética. Puse un sistema de pestañas, donde espero ir poniendo las conclusiones, y algunos retoque finales sobre el contenido...

Sobre el error en ie, intenté destripar a partir del objeto Ajax.responseXML, e incluso desde Ajax.responseXML.documentElement, modificando el bucle así:

Código:
	Ajax.onreadystatechange = function()	{
		mensaje = "<u>Objeto Ajax</u>";
		final = (Ajax.readyState == 4 && (Ajax.status == 200 || Ajax.status == 501));
		for (i in (final) ? Ajax.responseXML : Ajax)	{

			datos = obtener_dato((final) ? Ajax.responseXML:Ajax, i)
			...
Creo que será una de las primeras cosas que pondré en las conclusiones...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #10 (permalink)  
Antiguo 07/10/2008, 01:55
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: destripar objeto Ajax

Hola:

He conseguido que explorer no genere el el error que antes comentaba, haciendo una copia del objeto Ajax:

Código:
	_Ajax = objetoAjax();
	_Ajax.onreadystatechange = function()	{
		Ajax = _Ajax;	// copiamos el objeto
		for (i in Ajax)	{	// ya no hay error en explorer
		}
	}
También está actualizada la página, donde dupliqué la función destripe_final() para mantener el código original.

Pensaba poner como próxima conclusión la forma de conseguir que no se genere un XML mal formado (excelente aporte de MaBoRaK).

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo

Última edición por caricatos; 09/10/2008 a las 01:29 Razón: sintaxis
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:22.