Buongiorno programmatori, ho un problema con uno script che riguarda il caricamento di un accordion multilivello che ha questa struttura:
Il problema è che questa struttura non può essere cambiata perchè arriva da un altro file dinamicamente e io devo creare un menu con come titolo principale tutti Gli l1 e fin qui tutto ok,codice:<button class='l1'></button> <button class='l2'></button> <section class='linker'></linker> <section class='linker'></linker> <section class='linker'></linker> <section class='linker'></linker> <button class='l1'></button> <button class='l2'></button> <section class='linker'></linker> <section class='linker'></linker> <section class='linker'></linker> <section class='linker'></linker> <button class='l1'></button> <button class='l2'></button> <button class='l2'></button> <button class='l2'></button> <button class='l2'></button> <section class='linker'></linker> <section class='linker'></linker> <button class='l1'></button> <section class='linker'></linker> <section class='linker'></linker>
poi al click su l1 devo aprire "l' accordion" e se ci sono visualizzare tutti gli "l2" appena sotto l1 se no tutti i linker, se non ha l2 ma subito i linker apro linker ,
sono riuscito a fare ciò che mi serve in questo modo:
Il problema è che così facendo il .slideDown() ha un brutto comportamento di apertura in ritardo e dell' intero blocco l2, io ho bisogno di avere come con linker (Che invece è fluidissimo) lo slideDown del menu l2 ma non ho idea di come fare!codice:$(".l1").click(function(e) { //debugger; //Mostra tutto se non attivo fino al prossimo accordion di livello 1 (non mostra quelli di livello 3) //nascondi fino al prossimo accordion di livello 1 if ($(e.currentTarget).hasClass("active") == false) { $(e.currentTarget).addClass("active"); var cont = 0; var curr = e.currentTarget, next, stop = false; var toShow = []; var toHide = []; var linker, l2 = []; var flag = 0; do { cont++; next = $(curr).next()[0]; curr = next; //unica condizione di uscita è trovare un l1, parto da l1 e mi porto subito a next //se next è l2 o linker faccio: if ((($(curr).hasClass("l2")) && (flag == 0)) || (flag == 2)) { //se next è l2 , la prima volta entro, dalla seconda solo se sono flaggato flag = 2; toShow.push(curr); //curr = next; } if ((($(curr).hasClass("linker")) && (flag == 0)) || (flag == 3)) { //se next è un linker ,prima volta entro poi solo se sono flaggato come linker, quindi posso iterare su me stesso flag = 3; toShow.push(curr); } if ($(curr).hasClass("l1") || next === undefined) { stop = true; } if ($(curr).hasClass(undefined) || next == undefined) { stop = true; } } while (stop == false); // console.log(l2); //è qui che decido cosa far vedere ma facilmente grazie ai flag. for (var i = 0; i < toShow.length; i++) { if (($("#" + toShow[i].id).hasClass("l2")) && (flag == 2)) { /*-------------QUI INIZIANO I MIEI PROBLEMI--------*/ //Il, problema è che al caricamento degli l2 ho un brutto effetto di ritardo nell' aprire gli l2 // console.log("l2"); /* $("#" + toShow[i].id).slideDown({ duration: 100, easing: "swing" });*/ /* $("#" + toShow[i].id).css("display", "block"); $("#" + toShow[i].id).fadeIn(300);*/ /* } else if (flag == 3) { var linker = document.getElementsByClassName("linker"); $("#" + toShow[i].id).slideDown(); } } } else if ($(e.currentTarget).hasClass("active")) { $(e.currentTarget).removeClass("active"); var curr = e.currentTarget, next, stop; var toHide = []; do { next = $(curr).next()[0]; if ($(next).hasClass("l1") || $(next).hasClass("l2")) { if ($(next).hasClass("l2")) { toHide.push(next); curr = next; stop = false; } else { stop = true; } } else { toHide.push(next); curr = next; stop = false; if (next == undefined) { toHide.push(next); stop = true; } } } while (stop == false); for (var i = 0; i < toHide.length; i++) { $("#" + toHide[i].id).slideUp(); } if ($(toHide[toHide.length]).hasClass("active")) { $("#" + toHide[toHide.length].id + ".l2").trigger("click"); } } });

Rispondi quotando
