Comunidad de diseño web y desarrollo en internet online

getElementById y ajax :S

Citar            
MensajeEscrito el 26 Jul 2007 08:24 pm
Hola, soy "nuevo" en este foro y soy nuevo tambien en javascript, asi que no se practicamente nada.

Tengo problemas al cargar contenido asincronamente con ajax, porque tengo una funcion que (dentro de un window.addEvent('domready')) utiliza algunos elementos de mi codigo html usando document.getElementById, pero, luego de cargar algunos datos con ajax en la pagina, tambien necesito acceder a ellos con getElementById, pero no puedo porque todo esto esta dentro de el window.addEvent('domready') y me imagino que eso quiere decir, que todo lo que se ejecuta dentro de el, forma parte del dom inicial con el que se cargo la pagina inicialmente, pero luego de actualizarla asincronamente, el dom no cambia, y entonces, para mi codigo javascript, los elementos que cargo con ajax son invisibles y no los puedo alcanzar con getElementById.

Alguien sabe como puedo solucionar esto? espero no haber sido muy confuso :S yo no estoy muy claro en lo que estoy diciendo porque de verdad no conozco mucho.
Espero que me puedan ayudar, gracias!
(sin acentos)

Por volrath

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 27 Jul 2007 12:26 pm
Hola como te va ...
Estoy trabajndo con Ajax y JavaScript ... me podías explicar bién que tipo objetos son los que usas en el "document.getElementById" y que hacen esactamente ???
En realidad que es esactamente lo que queres hacer ???
Saludos.
Pablo

Por pablodante

1 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 27 Jul 2007 03:13 pm
Hola volrath, puedes colocar el código del javascript? para tratar de entender mejor tu error :?
Pablodante, tu avatar excede el tamaño máximo U_U aquí tenés las reglas acerca de avatares y firmas para su uso en el foro.
Saludos :wink:

Por psycho-vnz

Claber

1186 de clabLevel

7 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 28 Jul 2007 01:00 am
En realidad, cuando agregas elementos via ajax el DOM sí cambia, lo que tienes que hacer es ejectuar la función que navega el DOM después de haber hecho la llamada a ajax, quizás puedas usar un callback.

Por NEO_JP

BOFH

5724 de clabLevel

13 tutoriales
12 articulos

Genero:Masculino   Anime Bloggers Premio_Secretos Team Cristalab

Front-end Developer en Washington, DC

firefox
Citar            
MensajeEscrito el 28 Jul 2007 08:59 am
Hola! gracias por las respuestas.
El codigo es medio largo y tiene muchas cosas ke no son utiles, asi ke lo voy a colocar medio resumido, Ademas estoy trabajando con mootools (es la unica libreria ke conozco, asi que no sabre como hacer comparaciones con prototype, jquery o cualquier otra :S)

Aqui va el codigo:

Código :

window.addEvent('domready', function() {
   var list = $$('ul#listaUsuarios li');
   var msol = new Fx.Slide('mostrarSolicitudes').hide();
   var advt = new Fx.Slide('advForm').hide();
   /*
    * Primero defino lo que va a hacer cada uno de los li de la lista de usuarios
    */
   list.each(function(element) {
            
      var fx = new Fx.Styles(element, {duration:100, wait:false});
      
      //
      // ESTE ES EL UNICO EVENTO IMPORTANTE, LOS OTROS DOS SON DECORACION
      element.addEvent('click', function(){
         // Pongo el mensaje de espera en userProfile.
         $('userProfile').innerHTML="<div class=\"userCargador\"><img src=\"/sitemedia/images/icons/loader2.gif\" title=\"Cargando\"><br />Cargando...</div>"
         // Cierro MOSTRAR SOLICIUTDES
         msol.hide();
         
                   // Aqui van otras cosas de diseno que no vale la pena copiar
                   // ...
      
         // Seteo la url a pedir la informacion
         url = "/usuarios/"+carnet+"/";
         
         // Hago la peticion para recargar userProfile
         new Ajax(url, {       // ESTO ESTA HECHO CON LA CLASE AJAX DE MOOTOOLS.
            method: 'post',  /// PERO YA PROBE HACIENDOLO SIN ESTA CLASE, E IGUAL SIGO CON EL PROBLEMA
            update: $('userProfile'),
         }).request();
      
                    // FUNCION QUE SE ENCARGA DE PONER DATOS QUE NO TIENEN QUE VER CON EL PROBLEMA
         setearDatos(carnet);
      });
      
      element.addEvent('mouseenter', function(){
         // ...
      });
      
      element.addEvent('mouseleave', function(){
         // ...
      });
   });


   /*
    * Mostrar Solicitudes
    */
   $('toggleMe').addEvent('click', function(e) {
      e = new Event(e).stop();
      msol.toggle();
   });

   /*
    * Advertir
    */
    $('advertir').addEvent('click', function(e) {
       e = new Event(e).stop();
      advt.toogle();
    });
});


Ok, ahora explico un poco esto...
En mi html tengo un ul#listaUsuarios con una lista de usuarios. y tambien tengo un div#userProfile donde se van a cargar asincronamente los datos de el usuario que sea cargado en la lista. Inicialmente este div#userProfile se encuentra vacio, con esto quiero decir, al momento de cargar la pagina.

Luego lo voy a actualizar con la informacion que obtengo desde la url "/usuarios/"+carnet+"/", esta url me devuelve algo mas o menos asi:

Código :

<h2>Daniel Barreto</h2>
      <hr />
      <div class="advAmarillo">
         <p>
            <a href="#1" id="advertir" name="Advertir">(0) Advertir</a><br />
            <a href="#1" id="bannear" name="Bannear">Bannear Directamente</a><br />
            <a href="04-36723/prestamos/">Mostrar Solicitudes</a>
         </p>
      </div>


entonces ahi es donde esta el problema, para el momento de darle click a un usuario en la lista de usuarios, me devuelve ese contenido generado dinamicamente, y en ese contenido esta el link <a href="#1" id="advertir" name="Advertir">(0) Advertir</a> cuyo id es obviamente "advertir" y es el que quiero que cause un efecto al ser presionado. como se puede ver en las lineas:
/*
* Advertir
*/
$('advertir').addEvent('click', function(e) {
e = new Event(e).stop();
advt.toogle();
});

el error que tengo es que como $('advertir') ,que es similar a getElementById('advertir') en mootools, (no se si en las otras librerias tambien, no manejo mucho js ni nada asi que solo hablo de lo poco que he aprendido de mootools :P) no lo consigue el javascript al cargar la pagina me da el error de $(advertir) has no properties.

Creo que la cuestion esta en que todo esto esta en un window.addEvent('domready', function...), al momento de cargar el dom inicial, donde no esta a#advertir, me da este error. pero n he logrado corregirlo :S

Por volrath

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 28 Jul 2007 09:21 am

NEO_JP escribió:

En realidad, cuando agregas elementos via ajax el DOM sí cambia, lo que tienes que hacer es ejectuar la función que navega el DOM después de haber hecho la llamada a ajax, quizás puedas usar un callback.


Hola!. me podrias decir cual es esa funcion que navega el dom despues de haber hecho la llamada en ajax?? Porque hice lo siguiente: Cargue la pagina inicialmente con el div#userProfile vacio, y luego hice la llamada asincrona con ajax para llenarlo con los datos que mostre antes. Luego abri el inspector del arbol dom de firefox y vi que, efectivamente, en el arbol si estaban los nodos de la informacion recien cargada, los hr, h2, etc...
Pero luego intente hacer un getElementById('userProfile').hasChild() -hasChild() es un metodo que te dice si un nodo tiene hijos o no, no se si solo es de mootools o es nativo de javascript- y me devolvio falso.
Luego intente hacer un getElementById('body').getElementsByTagName('h2') para ver si asi lograba obtener el nodo h2 que cargo asincronamente, y tampoco lo logre, no me devolvio nada, vacio..
Entonces creo que para mi script de js, el dom nunca cambia, y nose como hacer para que vuelva a "recorrerlo" y ver los cambios.

Es a eso a lo que se refiere la funcion que nombras?

Por volrath

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 30 Jul 2007 12:55 am
Hola volrath,
Cuando cargas con ajax ese html los nodos si se crean y agregan al DOM, tal y como viste en el DOM Inspector de Firefox.

Lo que sucede es que estas tratando de agregar el evento click a #advertir ANTES de haberse creado, entonces cual es la solución? Agregarle el evento después de ser cargado con ajax.

Basicamente encierra advertir en una función para reusarla cada que la llamada AJAX ha sido completada.

Código :

function advertir(){
    $('advertir').addEvent('click', function(e) {
       e = new Event(e).stop();
      advt.toogle();
    });
}


Y luego agregas el metodo onComplete a la llamada AJAX.

Código :

new Ajax(url, {
    method: 'post',
    update: $('userProfile'),
    onComplete: advertir
    }).request();


No uso mootools, pero eso deberia funcionar. Solo es cuestión de saber cómo funciona el DOM, AJAX y leer un poco de documentación de la libreria.

Avisanos cómo quedó, un saludo.

Por NEO_JP

BOFH

5724 de clabLevel

13 tutoriales
12 articulos

Genero:Masculino   Anime Bloggers Premio_Secretos Team Cristalab

Front-end Developer en Washington, DC

firefox
Citar            
MensajeEscrito el 30 Jul 2007 03:38 am
Hola!, gracias NEO_JP, casualmente habia logrado resolver el problema ayer en la noche, y hoy estaba entrando a este foro para postear la respuesta, pero ya veo que te me adelantaste! ;), muchas gracias igual por todo!

Aqui esta como deje el codigo:

Código :

new Ajax(url, {
            method: 'post',
            update: $('userProfile'),
            onComplete: function() {
               // Binding...
                  $('advertir').addEvent('click', function(e) {
                     e = new Event(e).stop();
                     advt.slideIn();
                   });
               // ...
            }
         }).request();


esto funciona perfectamente.
Gracias a todos..

Por volrath

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 30 Jul 2007 04:03 am
Ah vaya usaste una función anónima, si esa tb es una solución. Personalmente prefiero tenerlo en una función con un nombre, asi se mantiene ordenado y se puede usar en algún otro momento.

Que bueno que lo hayas solucionado, un saludo.

Por NEO_JP

BOFH

5724 de clabLevel

13 tutoriales
12 articulos

Genero:Masculino   Anime Bloggers Premio_Secretos Team Cristalab

Front-end Developer en Washington, DC

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.