2012-02-18 23 views
59

estoy usando $(".button").on("click", function(){ });jQuery clic no funciona en ajax contenido generado

para hacer clic en un botón que se encuentra en un recipiente, pero luego se realiza una llamada Ajax y el contenido se actualiza con nuevas cosas y luego, cuando Intento hacer clic en .button no funcionará ... no se devolverá nada cuando haga clic en el botón.

Incluso he intentado

$(".button").live("click", function(){ }); 

o

$(".button").click(function(){ }); 

¿Cómo puedo hacer que funcione?

EDIT: mi html:

<div class="container"> 
    <ul> 
     <li>item1</li> 
     <li>item2</li> 
     <li>item3</li> 
    </ul> 
    <input type="button" value="reload" class="button" /> 
</div> 
+0

Mostrar lo que devuelve la llamada ajax. –

+0

Y el resto de jQuery que une al oyente. Lo que estás describiendo es exactamente lo que se supone que 'live 'debe manejar, por lo que es extraño que eso no funcione. – Brandan

+0

tengo un ul donde hago clic en ellos y simplemente repito "prueba" en javascript con .on ("clic") pero cuando hago clic en el botón hará una llamada ajax y volverá a cargar el ul pero luego dejará de hacer nada cuando hago clic en el botón ... no devolverá nada. – fxuser

Respuesta

123

Debe ser hecho de esta manera.

$('body').on('click', '.button', function(){ 
     alert('click!'); 
    }); 

Si usted tiene un recipiente que no cambia durante la petición Ajax, esto es con más prestaciones:

$('.container').on('click', '.button', function(){ 
     alert('click!'); 
    }); 

se unen siempre el caso delegado al elemento estático más cercano que contendrá los elementos dinámicos .

+0

Gracias por las respuestas! Todavía creo que esto es muy raro y no se siente bien para usar de esta manera. Wish jquery tenía una mejor manera de manejando este tipo de situaciones – Notflip

+1

@MiguelStevens, lea [en los documentos] (http://api.jquery.com/on) una vez que haya leído y entendido el concepto, no será extraño y tendrá mucho sentido. – gdoron

+0

gracias, fue realmente útil – Marounm

3

Es esto lo que estamos tratando de hacer? Tenga en cuenta que estoy poniendo el $.on() en el principal, pero seleccionando .button para la acción.

.ON (eventos [, selector] [, datos], manipulador (eventObject))

selector Una cadena selector para filtrar los descendientes de los elementos seleccionados que desencadenan el evento. Si el selector es nulo u omitido, el evento siempre se desencadena cuando alcanza el elemento seleccionado.

http://api.jquery.com/on/

<div id="stuff"> 
    <button class="button">Click me!</button> 
    <p>Stuff</p> 
</div> 

var $stuff = $('#stuff'), 
    ajaxContent = $stuff.html(); 

$stuff.on('click', '.button', function(){ 
    $.get('/echo/html/', function(){ 
     $stuff.empty(); 
     console.log($stuff.html()); 
     alert($stuff.html()); // Look behind, #stuff is empty. 
     $stuff.html(ajaxContent); 
     console.log($stuff.html()); 
    }); 
}); 

http://jsfiddle.net/62uSU/1

Otra demostración:

var $stuff = $('#stuff'), 
    ajaxContent = $stuff.html(), 
    $ajaxContent, 
    colors = ['blue','green','red'], 
    color = 0; 

$stuff.on('click', '.button', function(){ 
    $.get('/echo/html/', function(){ 
     color++; 
     if (color == colors.length) color = 0; 
     console.log($stuff.html()); 
     alert($stuff.html()); 
     $ajaxContent = $(ajaxContent); 
     $stuff.append($ajaxContent).css('color', colors[color]); 
     console.log($stuff.html()); 
    }); 
}); 

http://jsfiddle.net/62uSU/2/

38

Ok he resuelto mi problema mediante el uso de t he .on() funciona correctamente ya que me faltaba un parámetro.

en lugar de

$(".button").on("click", function() { }); 

he usado

$(".container").on("click", ".button", function() { }); 
+1

= (... Acaba de escribir lo mismo ... – gdoron

+1

Solo una nota, el [argumento de selector no es obligatorio] (http://jsfiddle.net/62uSU/3/), pero es necesario en este caso. –

+0

Gracias por la solución, +1 –

8

En lugar de:

$(".button").on("click", function() { }); 

utilicé:

$(".container").on("click", ".button", function() { }); 

He utilizado este y ha funcionado.

Cuestiones relacionadas