Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Frameworks JS (http://www.forosdelweb.com/f127/)
-   -   destripar objeto Ajax (http://www.forosdelweb.com/f127/destripar-objeto-ajax-626980/)

caricatos 22/09/2008 03:30

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 :arriba:

Panino5001 22/09/2008 04:55

Respuesta: destripar objeto Ajax
 
:aplauso: Simplemente, genial!!! (Lastima que deba esparcir karma a otros antes de volver a dártelo)

caricatos 22/09/2008 05:27

Respuesta: destripar objeto Ajax
 
Cita:

Iniciado por Panino5001 (Mensaje 2588299)
:aplauso: Simplemente, genial!!! (Lastima que deba esparcir karma a otros antes de volver a dártelo)

¡Je, je! :risa: 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!... :risa:), 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 :arriba:

GatorV 22/09/2008 11:45

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.

jseros 22/09/2008 15:57

Respuesta: destripar objeto Ajax
 
Sin comentarios. Realmente sensacional.

caricatos 26/09/2008 02:06

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()... :pensando:)
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 :arriba:

MaBoRaK 27/09/2008 10:13

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.

caricatos 27/09/2008 11:18

Respuesta: destripar objeto Ajax
 
Hola:

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

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 :arriba:

caricatos 06/10/2008 02:57

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 :arriba:

caricatos 07/10/2008 01:55

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 :arriba:


La zona horaria es GMT -6. Ahora son las 00:30.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.