2010-08-02 16 views
5

Estoy usando un poco de código sugerido por un miembro en stackoverflow y adaptado por mí para envolver cada 3 elementos de lista como parte de un mega menú. El código es:.slice y .wrapall

var lis = $("ul > li"); 
for(var i = 0; i < ls.length; i+=3) { 
    lis.slice(i, i+3).wrapAll("<div class='new'></div>"); 
} 

Desafortunadamente esto va a agarrar niño li en el menú siguiente matriz para llenar la 'cuota' de 3 li en un div. Esto es, por supuesto, un desastre masivo de mis menús. Para ver un ejemplo, visite aquí.

¿Alguien tiene alguna sugerencia de cómo puedo arreglar esto?

+1

¿Qué sucede si elimina '' 'de' ul> li'? –

Respuesta

6

su problema es el selector . Dado que sizzle funciona de derecha a izquierda, solo consultará todos los LI elements que tengan un UL element como padre directo (que generalmente siempre es el caso).

Por lo tanto, separe su ULs.

$('ul').each(function(){ 
    var $lis = $(this).children('li'); 
    for(var i = 0, len = $lis.length; i < len; i+=3){   
    $lis.slice(i, i+3).wrapAll("<div class='new'></div>"); 
    } 
}); 
+0

Gracias por la información Andy - disculpas pero soy muy nuevo en jQuery. Creo que entiendo la lógica detrás de lo que dices pero desafortunadamente no puedo obtener el fragmento de código que enviaste trabajando en la demostración que incluí arriba ... ¿También esto no terminaría envolviendo cada 3 li's en una página? ¿Sería mejor especificar ul.list-content como el ul? gracias por cualquier consejo – csbourne

+0

hmmn - lo siento todavía no es alegría con el código de arriba. ¿Funciona para ti? – csbourne

+0

@csbourne: bueno, estoy bromeando en http://www.jsfiddle.net/cbnFX/ Al menos hace lo que espero :) Pero no tengo ese complemento disponible allí. – jAndy

0

¿Has intentado aplicarlo con el uso de la clase como selector ht de esta manera?

var lis = $("ul.list-content > li"); 
for(var i = 0; i < lis.length; i+=3) { 
    lis.slice(i, i+3).wrapAll("<div class='new'></div>"); 
} 

Pero si usted no lo sabía, se lo advierto de que está violando la dom .. usted está poniendo en ul div que no es bueno ..;)

Cuestiones relacionadas