Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Problema conteggio checkbox

    salve!!
    ho una serie di checkbox che devono essere abilitate solo se in totale ne sono state ceccate meno di 3.
    in apertura di pagina:
    codice:
    var countProv = 0;
    $(document).ready(function() {
        $('#countProv input[type="checkbox"]').each(function() {
            if($(this).is(':checked')) {
                countProv++;
            }
        });
        if(countProv == 3) {
            $('#countProv input[type="checkbox"]').each(function() {
                if(!$(this).is(':checked')) {
                    $(this).attr('disabled', true);
                }
            });
        } else {
            $('#countProv input[type="checkbox"]').each(function() {
                $(this).removeAttr('disabled');
            });
        }
    });
    e fino qua ok.
    se in apertura ne sono selezionate tre le altre sono disabilitate.
    adesso però quando ne deseleziono una devo riabilitare le altre, e nel caso ne riseleziono un'altra le devo disabilitare di nuovo.
    avrei fatto questa funzione qua, ma non funziona:
    codice:
    function doCountProv() {
        $('#countProv input[type="checkbox"]').each(function() {
            if($(this).is(':checked')) {
                countProv++;
            } else {
                countProv--;
            }
        });
        console.log(countProv);
    }
    non funziona perchè come risultato mi da tipo -12 perchè in effetti ci stanno molte checkbox non ceccate.
    mi date un mano please??

  2. #2
    così forse dovrebbe andare:
    codice:
    function doCountProv(chk) {
        if($(chk).is(':checked')) {
            countProv++;
        } else {
            countProv--;
        }
        if(countProv == 3) {
            $('#countProv input[type="checkbox"]').each(function() {
                if(!$(this).is(':checked')) {
                    $(this).attr('disabled', true);
                }
            });
        } else {
            $('#countProv input[type="checkbox"]').each(function() {
                $(this).removeAttr('disabled');
            });
        }
        //console.log(countProv);
    }
    e quando clicco gli passo this come parametro.

  3. #3
    Se la prima parte di codice funziona, anche se non è bellissima, mettila in una function e richiamala quando ne hai bisogno.
    "Una volta che si saranno esaurite senza successo tutte le possibilita', ci sara' una soluzione, semplice e ovvia, che saltera' immediatamente all'occhio di chiunque altro."

    Guardate: Il Miracolo delle Noci!!

  4. #4
    Originariamente inviato da Lathspell
    Se la prima parte di codice funziona, anche se non è bellissima, mettila in una function e richiamala quando ne hai bisogno.
    bhe a me serve fare il controllo sia in apertura di pagina che poi quando si fa il click sulle checkbox.

    PS: come potrei migliorare quella parte di codice??

  5. #5
    Innanzitutto stai ciclando un insieme di oggetti (jQuery) che ripeti 3 volte, e per 3 volte chiedi a jQuery di attraversare il dom cercando quello che ti serve. Sarebbe buona cosa metterseli in cache e poi usarli ogni volta che ti servono.

    Scendendo ancora più nel dettaglio, in quella porzione di codice, jQuery nemmeno servirebbe, perchè potresti ottenere tutti gli elementi con il tag "input" del DOM e popolarti un array con solo quelli a cui sei veramente interessato. Usando poi i metodi nativi di Javascript per controllarli per i tuoi scopi.

    Da ultimo, i cicli forEach sono sempre sconsigliati, anche se con pochi elementi forse sono più comodi e non intaccano molto le performance.
    "Una volta che si saranno esaurite senza successo tutte le possibilita', ci sara' una soluzione, semplice e ovvia, che saltera' immediatamente all'occhio di chiunque altro."

    Guardate: Il Miracolo delle Noci!!

  6. #6
    Originariamente inviato da Lathspell
    Innanzitutto stai ciclando un insieme di oggetti (jQuery) che ripeti 3 volte, e per 3 volte chiedi a jQuery di attraversare il dom cercando quello che ti serve. Sarebbe buona cosa metterseli in cache e poi usarli ogni volta che ti servono.

    Scendendo ancora più nel dettaglio, in quella porzione di codice, jQuery nemmeno servirebbe, perchè potresti ottenere tutti gli elementi con il tag "input" del DOM e popolarti un array con solo quelli a cui sei veramente interessato. Usando poi i metodi nativi di Javascript per controllarli per i tuoi scopi.

    Da ultimo, i cicli forEach sono sempre sconsigliati, anche se con pochi elementi forse sono più comodi e non intaccano molto le performance.
    per il primo punto hai perfettemente ragione.
    devo fare un po di refactoring e compattare.

    per il secondo punto, il discorso è che a me concettualmente servono tutti.
    cioè io sono interessato a tutti, devo controllarne uno a uno e verificare che siano ceccati o meno, e in caso fare tutte le operazioni, ecc........
    quello che non mi viene bene è mettere tutto insieme compattando il tutto.
    -controllo iniziale
    -controll ad ogni click
    -eseguire le operazioni a seconda del risultato
    per come ho fatto funziona, anche se come dici è scritto un pò male.

  7. #7
    Originariamente inviato da fermat
    per il secondo punto, il discorso è che a me concettualmente servono tutti.
    Il getElementsByTagName fa quello. Poi sta a te trattare il risultato e capire se puoi scremarlo o se tenerlo tutto in cache e ciclarlo tutto ogni volta.
    e JQuery non ti serve in questo caso. Fidati.
    "Una volta che si saranno esaurite senza successo tutte le possibilita', ci sara' una soluzione, semplice e ovvia, che saltera' immediatamente all'occhio di chiunque altro."

    Guardate: Il Miracolo delle Noci!!

  8. #8
    Originariamente inviato da Lathspell
    Il getElementsByTagName fa quello. Poi sta a te trattare il risultato e capire se puoi scremarlo o se tenerlo tutto in cache e ciclarlo tutto ogni volta.
    e JQuery non ti serve in questo caso. Fidati.
    appena ho un attimo tento di sistemare tutta quella roba seguendo i tuoi consigli.
    grazie!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.