Foros del Web » Programando para Internet » Jquery »

jquery obtenga elemento recien agregado por ajax

Estas en el tema de jquery obtenga elemento recien agregado por ajax en el foro de Jquery en Foros del Web. Hola a todos: Mediante ajax agrego un elemento (tr) a una tabla, pero mi selector de jquery Código PHP: $( "#tabla1 tr:last" ). after ( response ...
  #1 (permalink)  
Antiguo 17/03/2010, 08:38
 
Fecha de Ingreso: junio-2008
Ubicación: Capital Federal xD
Mensajes: 1.208
Antigüedad: 15 años, 10 meses
Puntos: 35
jquery obtenga elemento recien agregado por ajax

Hola a todos:
Mediante ajax agrego un elemento (tr) a una tabla, pero mi selector de jquery
Código PHP:
$("#tabla1 tr:last").after(response.html); 
no reconoce el ultimo tr que agregué por ajax.
Como puedo lograrlo??
Gracias!
__________________
I am Doyle please insert code.
  #2 (permalink)  
Antiguo 17/03/2010, 09:04
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: jquery obtenga elemento recien agregado por ajax

Que funcion de ajax utilizas? Jquery propone varias. Y creo que todas de alguna manera tienen espacio para un "callback", es decir para ejecutar codigo tras haber traido html nuevo.

Podes publicar todo tu js?
  #3 (permalink)  
Antiguo 17/03/2010, 12:04
 
Fecha de Ingreso: junio-2008
Ubicación: Capital Federal xD
Mensajes: 1.208
Antigüedad: 15 años, 10 meses
Puntos: 35
Respuesta: jquery obtenga elemento recien agregado por ajax

Código PHP:
$.ajax({
    
urlpageUrl,
    
dataqueryString,
    
type"post",
    
dataType"json",
    
asyncfalse,
    
success: function(data){
       
response data.response[0];
       if(
response.status == 'true') {
          $(
"#lspAjaxPanel-periodList tr:last").after(response.html); 
La propiedad response.html posee el codigo html de un tr y su respectivo contenido, cada vez que llamo a toda esta función agrega ese tr al final de la tabla.
Pero luego el selector no reconoce al ultimo tr agregado
__________________
I am Doyle please insert code.
  #4 (permalink)  
Antiguo 17/03/2010, 12:33
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: jquery obtenga elemento recien agregado por ajax

Ese es ya un problema clasico. Yo a veces lo he solucionado haciendo un setTimeout("foo",300); Es decir, dandole 0.3 segundo de tiempo al script para que efectivamente el DOM se renueve antes de querer manipularlo.

Me gustaría publicaras también "el selector que no reconoce al ultimo tr agregado". Toda la secuencia de la acción.
  #5 (permalink)  
Antiguo 17/03/2010, 13:31
 
Fecha de Ingreso: junio-2008
Ubicación: Capital Federal xD
Mensajes: 1.208
Antigüedad: 15 años, 10 meses
Puntos: 35
Respuesta: jquery obtenga elemento recien agregado por ajax

Gracias por las molestias.
Al clickear un boton llamo a la 1° función (confirmDuplicatePeriod)
Código PHP:
     confirmDuplicatePeriod: function(){
        
setup.currentIdClassroom = $(this).attr("idperiod");
        $(
"#periodDialog-duplicate").dialog({
          
modaltrue,
          
buttons: {
             
Duplicate: function(){
                $(
this).dialog("close"); 
                 
//este botón llama a la funcion de abajo (duplicatePeriod)
                
setup.duplicatePeriod();
             },
             
Cancel: function(){
                $(
this).dialog('close');
             }
          },
          
width500
          
        
});
        $(
"#periodDialog-duplicate").dialog('open');
      },
      
      
      
duplicatePeriod: function(){
          var 
idClassroom setup.currentIdClassroom;
          var 
periodStartDate = $("#copyPeriodStartDate").val();
          var 
periodEndDate = $("#copyPeriodEndDate").val();
          var 
url LSP_C_BASE_URL LSP_C_CONTROLLER "/ajaxDuplicatePeriod";
          var 
result'false';
          var 
queryString "idPeriod=" idClassroom;
          
queryString += "&periodStartDate="+periodStartDate
          
queryString += "&periodEndDate="+periodEndDate;
          
queryString += "&periodName="+$("#duplicatePeriodName").val();
          $.
ajax({
             
urlurl,
             
dataqueryString,
             
type"post",
             
dataType"json",
             
asyncfalse,
             
success: function(data){
                
response data.response[0];
                if(
response.status == 'true') {
                    $(
"#lspAjaxPanel-periodList tr:last").after(response.html);
                    
setup.bindEvents();
                   
setup.message(response.message);
                }
                
setup.message(response.message);
                
result response.status;
             }
          });
          return 
result;
      }, 
__________________
I am Doyle please insert code.
  #6 (permalink)  
Antiguo 18/03/2010, 04:22
 
Fecha de Ingreso: diciembre-2009
Ubicación: Misiones
Mensajes: 867
Antigüedad: 14 años, 4 meses
Puntos: 65
Respuesta: jquery obtenga elemento recien agregado por ajax

tras un click queres insertar otro tr luego del último en la tabla #lspAjaxPanel-periodList ? la primera vez funciona la segunda ya no?
  #7 (permalink)  
Antiguo 18/03/2010, 06:29
Avatar de sublime_style  
Fecha de Ingreso: junio-2008
Mensajes: 69
Antigüedad: 15 años, 9 meses
Puntos: 1
Respuesta: jquery obtenga elemento recien agregado por ajax

Fijate primero que la llamada devuelva relamente el codigo html deseado,.

dataType: "json", en realidad no deberias declarar los datos como json puede que te de problemas por eso.

agregate el error del $.ajax para tener seguridad de que entra al sucess y no da error

error : funtion(e){alert(e)}
  #8 (permalink)  
Antiguo 18/03/2010, 07:13
 
Fecha de Ingreso: junio-2008
Ubicación: Capital Federal xD
Mensajes: 1.208
Antigüedad: 15 años, 10 meses
Puntos: 35
Respuesta: jquery obtenga elemento recien agregado por ajax

Tras un click debo insertar un nuevo tr luego del ultimo en la tabla.
Me olvidé aclarar lo siguiente: siempre me agrega los tr nuevos, o sea que siempre actúa SUCCESS, pero va agregandolos al final del tr que apuntaba al principio.
Ej:
Código PHP:
tr A
tr B
tr C 
//<-- ultimo tr de la tabla
//por ajax inserto nuevo tr
tr nuevo 1 // se inserta luego de tr C 
Pero el selector apunta siempre al tr C, como ultimo tr de la tabla, entonces al siguiente click
Código PHP:
//por ajax inserto nuevo tr
//lo inserta luego de tr C pero antes de tr nuevo 1
tr A
tr B
tr C
tr nuevo 2 
tr nuevo 1 
El selector no reconocio a tr nuevo 1 como ultimo tr de la tabla, yo quiero que tr nuevo 2 valla despues de tr nuevo 1.
__________________
I am Doyle please insert code.
  #9 (permalink)  
Antiguo 18/03/2010, 08:14
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: jquery obtenga elemento recien agregado por ajax

Bueno, yo no estoy habituado a programar como objetos. Lo que si, creo que no publicastes todas las funciones entonces es dificil seguir el flujo de tus llamadas.

Igual, proba cambiar esto: setup.bindEvents();

Por esto: setTimeout("setup.bindEvents();",300);

Y si funciona se confirma mi teoría: tu llamada se anticipa a la actualización del DOM. Suele pasar.
  #10 (permalink)  
Antiguo 18/03/2010, 08:42
 
Fecha de Ingreso: junio-2008
Ubicación: Capital Federal xD
Mensajes: 1.208
Antigüedad: 15 años, 10 meses
Puntos: 35
Respuesta: jquery obtenga elemento recien agregado por ajax

Intenté el setTimeout pero sigue sin funcionar, para mi el problema está en el selector que no reconoce el nuevo tr agregado por ajax,

Código PHP:
$("#lspAjaxPanel-periodList tr:last").after(response.html);
setup.bindEvents();//es un metodo que bindea metodos a elementos
setup.message(response.message);//solo muestra un mensaje en otro div 
__________________
I am Doyle please insert code.
  #11 (permalink)  
Antiguo 18/03/2010, 08:56
 
Fecha de Ingreso: junio-2008
Ubicación: Capital Federal xD
Mensajes: 1.208
Antigüedad: 15 años, 10 meses
Puntos: 35
Respuesta: jquery obtenga elemento recien agregado por ajax

ok solucionado, le saque el ; al 1° argumento
setTimeout("setup.bindEvents()",300);
Ahora funciona, pero resulta que he actualizado mi archivo js del proyecto, con mejoras sustanciales (hechas por otros)y me ha afectado otros metodos, si esto anduvo no lo toco mas!!
Ahora me queda la duda si se solucionó por el settimeout o por actualizar el js
Gracias por su ayuda!!!
__________________
I am Doyle please insert code.
  #12 (permalink)  
Antiguo 18/03/2010, 09:04
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: jquery obtenga elemento recien agregado por ajax

Fijate. Igual, desconociendo tu script, propongo que evalues usar live() en vez de esto: setup.bindEvents();//es un metodo que bindea metodos a elementos

Así, cada elemento nuevo tendrá las funcionalidades asignadas. Creo. Vos dirás.
  #13 (permalink)  
Antiguo 18/03/2010, 09:40
 
Fecha de Ingreso: diciembre-2009
Ubicación: Misiones
Mensajes: 867
Antigüedad: 14 años, 4 meses
Puntos: 65
Respuesta: jquery obtenga elemento recien agregado por ajax

como es la estructura de tu json? podes postear la salida como texto asi vemos que es lo que estas recibiendo
  #14 (permalink)  
Antiguo 18/03/2010, 09:56
 
Fecha de Ingreso: junio-2008
Ubicación: Capital Federal xD
Mensajes: 1.208
Antigüedad: 15 años, 10 meses
Puntos: 35
Respuesta: jquery obtenga elemento recien agregado por ajax

setup.bindEvents() no lo puedo tocar,
copio el response completo
Código PHP:
{
  
"response": [
                {
                    
status'true',
                    
message'  <div class="lspEvent-message msgBox">      <p class="success">        The semester has been duplicated successfully.    </p>    </div>',
                    
html'<tr><td width="22%">nuevo periodo</td><td width="8%">03/01/10</td><td width="8%">03/31/10</td><td width="5%"><span class="added pad5 bold">Open</span></td><td width="25%">  <a href="javascript://" class="lspEvent-editPeriod ui-state-default ui-corner-all fg-button fg-button-icon-left" idPeriod ="13"><span class="ui-icon ui-icon-pencil"></span>Edit</a>  <a href="javascript://" class="lspEvent-managePeriod ui-state-default ui-corner-all fg-button fg-button-icon-left" idPeriod="13"><span class="ui-icon ui-icon-gear"></span>Manage</a>  <a href="javascript://" class="lspEvent-duplicatePeriod ui-state-default ui-corner-all fg-button fg-button-icon-left" idPeriod="13"><span class="ui-icon ui-icon-gear"></span>Duplicate</a></td></tr>',
                    
idInserted'',
                    
statusCode'7028'

                
}
              ]

__________________
I am Doyle please insert code.
  #15 (permalink)  
Antiguo 18/03/2010, 10:20
 
Fecha de Ingreso: diciembre-2009
Ubicación: Misiones
Mensajes: 867
Antigüedad: 14 años, 4 meses
Puntos: 65
Respuesta: jquery obtenga elemento recien agregado por ajax

esta mal tu json, los pares de clave/valos debenentre comillas y los valores de tus atributos html con comillas simples asi no da error con las comillas de inicio

Código HTML:
{
  "response": [
                {
                    "status": "true",
                    "message": "<div class='lspEvent-message msgBox'><p class='success'>The semester has been duplicated successfully.</p></div>",
                    "html": "<tr><td width='22%'>......................",
                    "idInserted": "",
                    "statusCode": "7028"
                }
              ]
}
yo hice un ejemplo solo para leer la clave "html" y funciona bien mira,

json
Código HTML:
{
  "response": [
                {
                "html": "<tr><td><% out.print(request.getParameter("para")); %></td><td>nada</td></tr>",
                }
              ]
}
la parte de <% out.print(request.getParameter("para")); %> es porque es un jsp en php ponele un echo $_GET['para'] y modifica la url

el html y jquery
Código HTML:
<html>
<head>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
  <script>
    $(function (){
        var i = 2;
        $('a').click(function(){
             $.ajax({
                url: "uno.jsp?para="+(i++),
                dataType: "json",
                success: function(data){
                    response = data.response[0];
                    $("table tr:last").after( response.html );
                },
                error: function(){alert("error")}
             });
        });
    });
  </script>
<style>
    tr {background-color:red}
    td{width:100px}
</style>
</head>
<body>
    <a href="#">Insertar</a>
    <table>
        <tr><td>1</td><td>1</td></tr>
    </table>
</body>
</html> 
la variable para envia un valor al json asi vemos que se inserta el resultado despues de la ultima fila

también se puede usar $("#latabla").append( response.html );

Última edición por Dany_s; 18/03/2010 a las 10:26
  #16 (permalink)  
Antiguo 09/07/2010, 18:11
 
Fecha de Ingreso: noviembre-2007
Mensajes: 3
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: jquery obtenga elemento recien agregado por ajax

Hola doylelives!
Has conseguido solucionar el problema? Te lo pregunto porque yo tengo justa y exactamente el mismo problema que tu (aunque yo no uso AJAX).

En un plugin que me estoy montando hay el siguiente código:
Código Javascript:
Ver original
  1. $List.children().last().click(function() {         
  2.     var nextValue = Number($(this).html())+1;
  3.     if(nextValue<=params.maxValue) {
  4.         $List.append(params.insTag).children().last().html(nextValue);
  5.         $List.children().first().remove();
  6.     }  
  7. });

El código realiza como un sencillo slideshow de 3 numeros. Deberia insertar una fila al final de la lista al hacer click en la última fila de ésta, mientras elimina la primera. Y funciona bien... la primera vez. Pero luego ya no funciona más. De hecho funciona al hacer click a la penúltima fila, y luego a la antepenultima. Es decir, el problema supongo está en:

Código Javascript:
Ver original
  1. $List.children().last().click(function() {...

Como bien dices, parece que no detecta los elementos creados recientemente.

También he probado con:
Código Javascript:
Ver original
  1. $List.children().last().live('click', function() {...
pero aún peor, ya que no funciona ni la primera vez.

Espero que si has encontrado la solución me puedas hechar una mano. Muchas gracias!

Última edición por marcarronnis; 09/07/2010 a las 18:17
  #17 (permalink)  
Antiguo 31/05/2011, 13:54
 
Fecha de Ingreso: julio-2009
Mensajes: 11
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: jquery obtenga elemento recien agregado por ajax

El problema está en la funcion live() usa delegate()

Saludos.

Etiquetas: ajax, recien
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 06:34.