Tabella con righe a scomparsa jQuery

di il
3 risposte

Tabella con righe a scomparsa jQuery

Buongiorno a tutti. In un "sito di ecommerce" ho creato una tabella con l'elenco degli ordini effettuati. Vorrei che cliccando sulla riga (o su un bottone va bene lo stesso) mi comparissero i dettagli dell'ordine. Quindi cliccando su una riga vorrei si aggiungesse un'altra riga/div/ecc con i dettagli dell'ordine.
Ho provato con jQuery ma non sono molto esperto. Vi lascio il codice.
Qui è dove creo la tabella sulla pagina php.
    $("#tbody").append("<tr id='riga" + i + "'><th scope='row'>" + idordine + "</th><td>" + data + "</td><td>" + prezzoTotale + "€</td><td> <button id='button_" + i + " '>Dettagli</button></tr><tr id='orderdetail_" + i + "' style='display:none;'><th scope='row'> ciao </th><td>ciao2</td><td>ciao2</td><td>ciao2</td></tr> ");
Nella stessa pagina js io avevo provato a mettere un ciclo for per selezionare tutti i bottoni e inserirgli l'onclick. Mi spiego con un esempio.
Il bottone "button_0" deve far comparire la riga con id = "orderdetail_0", quindi facevo un ciclo for così
for (var i = 0; i < ordini.length; i++) {
            $("#button_"+i).click(function () {
                $("#orderdetail_"+i).toggle("slow");
            });
        }
Così facendo però non funziona. Non gli piace il "+i" probabilmente. O sbaglio?
Qualcuno può gentilmente aiutarmi a trovare una soluzione alternativa?
A me piacerebbe di più che comparissero i dettagli selezionando tutta la riga e non mettendo un pulsante. però va bene anche con un bottone.

Grazie mille

3 Risposte

  • Re: Tabella con righe a scomparsa jQuery

    Codice completo?
  • Re: Tabella con righe a scomparsa jQuery

    Mi spiego meglio

    In una pagina php di un sito di ecommerce io devo mostrare gli ordini effettuati dal cliente. Vorrei creare una tabella con una lista dei suoi ordini e per ogni riga vorrei ci fosse un tasto che mi facesse comparire/scomparire, sotto alla riga , i dettagli dell’ordine.
    La porzione di codice della pagina php che interessa è questo
    <div class="row">
                        <div class="col-md-10 offset-1 corpoareaclienti" id="corpoareaclienti">
                        </div>
    Che è semplicemente un div vuoto che verrà riempito da una funzione javascript nel momento in cui sulla stessa pagina viene premuto un button “mostra acquisti”.
    var mostraacquisti = document.getElementById("mostraacquisti"); 
    mostraacquisti.onclick = getOrders;
    GetOrders fa una richiesta ajax alla pagina ordini.php che genera un file xml con i dati degli ordini. Dopodiché richiama la funzione showOrders che serve a stampare la tabella nella pagina php.
    function getOrders() {
            new Ajax.Request("ordini.php",
                    { method: "GET",
                        onSuccess: showOrders,
                        onFailure: ajaxFailed,
                        onException: ajaxFailed });   }
    
    function showOrders(ajax) {
    //Crea la tabella degli ordini effettuati
            $("#corpoareaclienti").html("<h3 class='text-center'> Elenco degli ordini effettuati</h3>");
            var ordini = ajax.responseXML.getElementsByTagName("ordine");
            if (ordini.length > 0) {
                $("#corpoareaclienti").append("<table class='table text-center' id='ordini'> <thead id='intestazione'><tr id='riga'><th scope='col'>Numero ordine</th><th scope='col'>Data ordine</th><th scope='col'>Prezzo Totale</th><th scope='col'>Dettagli</th></tr></thead><tbody id='tbody'>");
                for (var i = 0; i < ordini.length; i++) {
                    var idordine = ordini[i].getAttribute("idordine");
                    var data = ordini[i].getElementsByTagName("data")[0].firstChild.nodeValue;
                    var prezzoTotale = ordini[i].getElementsByTagName("prezzoTotale")[0].firstChild.nodeValue;
                    $("#tbody").append("<tr id='riga" + i + "'><th scope='row'>" + idordine + "</th><td>" + data + "</td><td>" + prezzoTotale + "€</td><td> <button class='togglebutton' id='button_" + i + "'>Dettagli</button></td>");
                    dettagliordine(idordine);  *****questa funzione è il problema. È all’interno del ciclo perché per ogni ordine vorrei che mi stampasse i dettagli in una“riga nascosta”.  Ma … **********
                    $("#tbody").append("</tbody></table>");
                }
            } else {
                $("#corpoareaclienti").html("<h3 class='text-center'>Non sono presenti ordini </h3><hr class='dividing_element'>");
            }
    // handle toggle (funzinoe per far comparire/scomparire la riga sotto a quella di cui premiamo il tasto dettagli
            $("button.togglebutton").click(function () {
                $(this).closest("tr").next().toggle("slow");
            });
        }
    ********… il problema è che mi vengono stampate tutte le righe degli ordini e solo successivamente tutte le righe con i dettagli. Quindi mi viene stampato :
    Ordine 1
    Ordine 2
    Ordine 3
    dettagliOrdine 1
    dettagliOrdine 2
    dettagliOrdine 3

    e non

    Ordine1
    dettagliOrdine 1
    Ordine 2
    dettagliOrdine 2
    Ordine 3
    dettagliOrdine 3
    come vorrei.

    La funzione dettagliordine(idordine) è semplicemente un’altra richiesta ajax ad un altro file (ordine.php) che genera l’xml con i dettagli dell’ordine. Quindi.
    <ordine idordine="80027">
    <prodotto codiceprodotto="1">
    <nome> NomeOrologio1</nome>
    <descrizione> Descrizione orologio 1</descrizione>
    <prezzo> 34</prezzo>
    <immagine> or1.jpg</immagine>
    <categoria> orologeria</categoria>
    </prodotto>
    <prodotto codiceprodotto="5">
    <nome> Nomeorologio5</nome>
    <descrizione> Descrizione 5 orologio</descrizione>
    <prezzo> 12</prezzo>
    <immagine> or2.jpg</immagine>
    <categoria> orologeria</categoria>
    </prodotto>
    </ordine>
    In particolare
    
    function dettagliordine(idordine) {
    new Ajax.Request("ordine.php",
                    {  method: "GET",
                        parameters: {idordine: idordine},
                        onSuccess: stampadettagli,
                        onFailure: ajaxFailed,
                        onException: ajaxFailed}); }
    
        function stampadettagli(ajax) {
            var prodotti = ajax.responseXML.getElementsByTagName("prodotto");
            if (prodotti.length > 0)
            {
                $("#tbody").append("<tr id='orderdetail' style='display:none;'><td colspan=4><h1>Dettagli dell'ordine</h1><hr/>");
                for (var j = 0; j < prodotti.length; j++) {
                    var codiceprodotto = prodotti[j].getAttribute("codiceprodotto");
                    var nome = prodotti[j].getElementsByTagName("nome")[0].firstChild.nodeValue;
                    var descrizione = prodotti[j].getAttribute("descrizione");
                    var prezzo = prodotti[j].getAttribute("prezzo");
                    var immagine = prodotti[j].getAttribute("immagine");
                    var categoria = prodotti[j].getAttribute("categoria");
                    $("#orderdetail").append("<p>codice : " + codiceprodotto + " Nome: " + nome + "g:"+j+"  </p> ");
                }
                $("#tbody").append("</td></tr>");}}
        function showDettagliAccount(ajax) {
    $("#corpoareaclienti").html("");
            var cliente = ajax.responseXML.getElementsByTagName("cliente");
            for (var i = 0; i < cliente.length; i++) {
                var nome = (cliente[i].getElementsByTagName("nome")[0]).firstChild.nodeValue;
                var cognome = (cliente[i].getElementsByTagName("cognome")[0]).firstChild.nodeValue;
                var mail = (cliente[i].getElementsByTagName("mail")[0]).firstChild.nodeValue;
                $("#corpoareaclienti").html("<h3 class='text-center'> Dettagli account</h3><hr class='dividing_element'>");
                $("#corpoareaclienti").append("<h4> Cliente : </h4><p>" + nome + " " + cognome + "</p><h5> Mail  : </h5><p>" + mail + "</p>");
                $("#corpoareaclienti").append("<button id='eliminautente' class='btn btn-outline-danger' value='" + mail + "'>Elimina account</button>");
                var deleteButton = $("#eliminautente");
                deleteButton.onclick = eliminaUtente; }}
    Non riesco a capire cosa sbaglio. Probailmente è tutto concettualmente sbagliato XD ma non riesco ad uscirne.
  • Re: Tabella con righe a scomparsa jQuery

    A me sembra un problema di sincronizzazione con le chiamate AJAX dentro un loop si rischia che l'ordine non venga rispettato. Dai un'occhiata :

    https://stackoverflow.com/questions/22621689/javascript-ajax-request-inside-loops
Devi accedere o registrarti per scrivere nel forum
3 risposte