2012-03-14 10 views
5

Quiero borrar todos li dentro de un ul a excepción de los cinco lis anteriores y los cinco lis siguientes.borrar todo li excepto los cinco lis anteriores y los cinco lis siguientes

Por ejemplo:

<ul> 
    <li id="Li0"></li> 
    <li id="Li1"></li> 
    <li id="Li2"></li> 
    <li id="Li3"></li> 
    <li id="Li4"></li> 
    <li id="Li5"></li> 
    <li id="Li6"></li> 
    <li id="Li7"></li> 
    <li id="Li8"></li> 
    <li id="Li9"></li> 
    <li id="Li10"></li> 
    <li id="Li11"></li> 
    <li id="Li12"></li> 
    <li id="Li13"></li> 
    <li id="Li14"></li> 
    <li id="Li15"></li> 
    <li id="Li16"></li> 
    <li id="Li17"></li> 
    <li id="Li18"></li> 
    <li id="Li19"></li> 
    <li id="Li20"></li> 
</ul> 

Digamos que hago clic en Li con id Li9. Por lo que el resultado debe ser

<ul> 
    <li id="Li4"></li> 
    <li id="Li5"></li> 
    <li id="Li6"></li> 
    <li id="Li7"></li> 
    <li id="Li8"></li> 
    <li id="Li9"></li> 
    <li id="Li10"></li> 
    <li id="Li11"></li> 
    <li id="Li12"></li> 
    <li id="Li13"></li> 
    <li id="Li14"></li> 
</ul> 

Sé que hay :lt() y :gt() selectores para excluir elementos, pero hasta ahora no han hecho muchos progresos.

+0

Su código de ejemplo no refleja lo que desea hacer. Desea eliminar todo excepto el primero y el último cinco.Pero tu ejemplo es todo lo contrario. Por favor edita. –

Respuesta

11

Si desea eliminar todos los elementos excepto el anterior y cinco siguientes, en relación con el elemento se ha hecho clic, puede utilizar .slice()[docs] junto con .index()[docs]:

// assuming `this` refers to the clicked li element 
var index = $(this).index(), 
    $lis = $(this).parent().children(); 

// Math.max(...) guarantees that we are not removing from 0 to the end of 
// the list of `index - 5` is negative. 
// Alternatively you can use `5 > index ? 0 : index - 5` 
$lis.slice(0, Math.max(0, index - 5)).add($lis.slice(index + 6)).remove(); 

Esta fue la respuesta a la pregunta "Eliminar todos menos el primero y los últimos cinco elementos en una lista".

que es muy fácil de hacer con .slice()[docs]:

$('ul > li').slice(5, -5).remove(); 
+0

Esto no es del todo correcto: quiere eliminar los 5 elementos 'li' anteriores y siguientes, en relación con el que se hizo clic. –

+1

@Rory: Hmm. Para ser sincero, la pregunta está formulada de manera extraña ... –

+0

@FelixKling He intentado esto pero no funciona, puede deberse a un problema de sintaxis. var ulPrnt = $ (spnID) .parents ("ul: first"); $ (ulPrnt + '> li'). Slice (5, -5) .remove(); – ankur

2

Para eliminar los elementos relativos a la que se ha hecho clic es necesario utilizar index():

$("li").click(function() { 
    var $li = $('ul > li').slice($(this).index() - 5, $(this).index() + 6) 
    $('ul > li').not($li).remove(); 
}); 

Example fiddle

ACTUALIZACIÓN

Para tener en cuenta los escenarios donde el índice + -5 está fuera de los límites del índice de li intente esto:

$("li").click(function() { 
    var start = $(this).index() - 5; 
    var end = $(this).index() + 6; 
    var $li = $("ul > li"); 

    start = (start < 0) ? 0 : start; 
    end = (end > $li.length) ? $li.length : end; 

    var $keepLi = $li.slice(start, end) 
    $li.not($keepLi).remove(); 
}); 

Example fiddle

+0

su script funciona a la perfección, excepto en algunos casos. Si el índice en el que hizo clic tiene menos de cinco elementos en el elemento anterior o próximo al clic. Entonces puedes manejar eso. – ankur

+1

Ver mi respuesta actualizada –

1

que haría uso de los :lt() y :gt() selectores como usted señaló.

$('ul').on('click', 'li', function (e) { 
    index = $(this).index(); 
    $('ul > li:lt(' + (index - 5) + ')'). 
     add($('ul > li:gt(' + (index + 5) + ')')).remove(); 
    e.preventDefault(); 

});

Seleccionamos todos los li s que tienen un índice que es más pequeña que la clic menos 5, añadir a la colección de todos los li s que tienen un índice mayor que el hizo clic en más 5 y luego quitó todos esos elementos.

aún más corto:

$('ul > li').remove(':lt(' + (index - 5) + '), :gt(' + (index + 5) + ')'); 

Remove() acepta un selector opcional para filtrar elementos de la selección actual con.

Ver ejemplo here

Cuestiones relacionadas