2012-02-08 12 views
6

Necesito ayuda con mi script jQuery. Tengo una página que se renueva cada 10 segundos y se agregan nuevos divs de un feed.Eliminar divs antiguos si hay más de 20 | jQuery

Mi script cuenta los divs y elimina el último div cuando hay más de 20 divs. Esto funciona bien si el feed solo agrega 1 div a la vez. Pero el feed también puede agregar multiply divs al mismo tiempo. Cuando esto sucede, el conteo puede exceder el máximo de 20 divs. El problema con esto es que mi script simplemente borra 1 div y no todos los divs que exceden los 20 count.

Este es mi código:

var $auto_refresh = setInterval(function() { 
    var $articleCount = $('div').length; 

    if ($articleCount > 20) { 
     $('div:last-child').remove(); 
    } 

    $autoUpdate(); 
}, 10000); // refresh every 10000 milliseconds for new items 

necesito para eliminar todos los divs adicionales por lo que siempre son 20 divs. Espero que alguien pueda ayudarme con esto.

Respuesta

3
var $auto_refresh = setInterval(function() { 
    var $articleCount = $('div').length; 

    while ($articleCount > 20) { 
     $('div:last-child').remove(); 
     $articleCount = $('div').length; 
    } 

    $autoUpdate(); 
}, 10000); 

notar el cambio de if a while. Esto mantiene la supresión de la anterior hasta que haya 20.

+2

Esto no funcionaría porque '$ articlecount' realmente no actualiza durante el' while';) – Supr

+0

Ahora lo hace con seguridad. –

+0

lo siento, pensé que este era el caso de [HTMLCollection en vivo] (http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-75708506) - no se dio cuenta hecho su longitud una variable separada –

1

Uso del selector de greater than:

var $auto_refresh = setInterval(function() { 

    $('div:gt(20)').remove(); 

    $autoUpdate(); 
}, 10000); // refresh every 10000 milliseconds for new items 
+0

¿no debería actualizar '$ artículoCount' dentro del cuerpo del bucle? – xbonez

+0

': gt' es un filtro jQuery, por lo que usarlo como parte de su selector detendrá jQuery usando el motor CSS para seleccionar los divs, lo que significa un golpe de rendimiento. Mejor ir con '$ ('div'). Filter (': gt (20)')', o algo similar ('.slice() ') – Joe

+0

@Joe ¿Crees que el rendimiento es un problema aquí? –

0
var $auto_refresh = setInterval(function() { 

    while ($('div').length > 20) { 
     $('div:last-child').remove(); 
    } 

    $autoUpdate(); 
}, 10000); // refresh every 10000 milliseconds for new items 
0
while ($articleCount > 20) {    
     $('div:last-child').remove(); 
     $articleCount = $('div').length; 
    } 
2

Usted podría utilizar .slice(x) para eliminar todos los elementos desde el índice x y sobre: ​​http://jsfiddle.net/PLKAm/.

$("div").slice(20).remove(); 

Si hay <= 20 artículos entonces .slice(20) devuelve un conjunto vacío, por lo que el código es un no-op automáticamente.

0

Editado por simplicidad:

$('div').each(function(count){ 
    if(count >= 20){ 
     $(this).remove(); 
    } 
}); 
+0

No sé por qué se rechaza esto –

+0

Puede simplificar esto: [cada función] (http://api.jquery.com/each/) tiene dos parámetros y el primero es el índice, por lo que su número de var no es necesario. –

+0

@ TimBüthe Gracias, editado. – wanovak

6

Uso jQuery.slice para tener todo pasado el número 20, y la bandeja de ellos - muertos fácil :)

var $auto_refresh = setInterval(function() { 
    $('div').slice(20).remove(); 
    $autoUpdate(); 
}, 10000); // refresh every 10000 milliseconds for new items 

http://api.jquery.com/slice/

0

Se podría utilizar el Selector :gt() para encontrar los elementos de una sola vez.

var $auto_refresh = setInterval(function() { 
    var nToDelete = $('div').length - 20; // Calculate how many there are to delete...  
    if(nToDelete > 0) $('div:gt(" + nToDelete + ")').remove(); // and delete them. 
    $autoUpdate(); 
}, 10000); 
0
var remove21 = function() { 
    if ($('div').length > 20) { 
     $('div:nth-child(21)').remove(); 
     remove21(); 
    } 
} 

var $auto_refresh = setInterval(function() { 

    remove21(); 

    $autoUpdate(); 
}, 10000); // refresh every 10000 milliseconds for new items 
Cuestiones relacionadas