Tabella con righe a scomparsa jQuery

di Anonimizzato27024 il
3 risposte
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

  • Codice completo?
  • 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.
Devi accedere o registrarti per scrivere nel forum
3 risposte