2011-02-14 11 views
7

estoy usando el siguiente jQuery para tirar de nuevos datos y reemplazar el contenido del DIV ListDataUsando jQuery Vuelvaa para reemplazar el contenido del DIV única de trabajo primera vez

$(function(){ 
$('.refresh').click(function(event) { 
    event.preventDefault(); 

    $.ajax({ 
     url: "_js/data.php", 
     success: function(results){ 
      $('#listdata').replaceWith(results); 
     } 
    }); 
}); 
}); 

El guión es provocada por numerosos enlaces en la página, como:

<a href="" id="update1" class="refresh">Update 1</a> 
<a href="" id="update2" class="refresh">Update 2</a> 

Por alguna razón, la secuencia de comandos solo funciona en el primer clic de un enlace. Los clics posteriores no actualizan los datos.

He visto varias correcciones, pero nada de lo que pueda hacer funcionar. ¿Alguna sugerencia?

+0

¿Número del asunto? ... –

Respuesta

27

Me parece que su problema es con el uso de replaceWith.

Está eliminando el elemento que coincide con $('#listdata') en la primera llamada de replaceWith, por lo que las actualizaciones posteriores no pueden encontrar dónde se supone que los datos deben colocarse en el documento.

Usted podría intentar algo así como

$('#listdata').empty(); 
$('#listdata').append(results); 

o encadenado como este

$('#listdata').empty().append(results); 
+0

Creo que has dado en el clavo, pero esta solución en particular no funciona – Paul

+0

Lo siento, me perdí que habías cambiado ** replaceWith ** por ** append **. ¡Perfecto! – Paul

+0

@Sam Dufel Tengo el mismo problema, aún refresca ... – EBM

0

Probar:

$('a.refresh').live('click', function(e) { 
    e.preventDefault(); 

    $.ajax({ 
     url: '_js/data.php', 
     success: function(data) { 
      $('#listdata').empty().html(data); 
     } 
    }); 
}); 

Si los .refresh anclajes están dentro del elemento #listdata, a continuación, la delegación es una solución más optimizada:

var list = $('#listdata'); 

list.delegate('a.refresh', 'click', function(e) { 
    e.preventDefault(); 

    $.ajax({ 
     url: '_js/data.php', 
     success: function(data) { 
      list.empty().html(data); 
     } 
    }); 
}); 
+0

Tenga en cuenta que con su solución '.delegate()', está reemplazando el elemento '# listdata' en sí, por lo que perderá el controlador' .delegate() '. EDITAR: Podrías hacer 'list.parent(). Delegate ('# listdata a.refresh', 'cli ...' – user113716

+0

Desafortunadamente esto es lo primero que intenté sin suerte. Creo que la respuesta de Sam está en la línea correcta , en ese ** replaceWith ** está quitando el div. Desafortunadamente todavía no estoy más cerca de la respuesta. – Paul

+0

@Paul He actualizado mi respuesta –

0

Tendrá que cambiar el href de sus enlaces a < a href = "#" > ... </a >. Esto evita que el navegador se actualice cuando hace clic en el enlace.

Si está haciendo las cosas de esta manera, también deberá colocar un "return false" al final del controlador de clics para evitar el burbujeo.

+0

El OP usa preventDefault() para deshabilitar los anclajes ... –

+0

Además, el burbujeo no es un problema aquí. –

3

Si está utilizando replaceWith(), que está reemplazando #listdata con un elemento nuevo por completo.

Si data no es algo así como <div id="listdata"></div> continuación #listdata está desapareciendo después de la replaceWith(). Estoy pensando que probablemente deberías usar html() en su lugar.

Cuestiones relacionadas