Visualizzazione dei risultati da 1 a 10 su 10

Hybrid View

  1. #1
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,780
    Ho dato uno sguardo

    Prima cosa: non tenere conto di quanto ho indicato nei post precedenti. Non conoscendo il plugin ho scritto qualche castroneria facendo supposizioni errate

    In realtà la tabella viene aggiornata regolarmente quando manovri i checkbox. Gli elementi che sono mostrati a video sono esattamente parte di quelli che stanno dentro l'istanza dataTable.

    Il problema sta in quel ciclo del submit, come avevi immaginato tu.

    Analizzando meglio ciò che va a fare quello script, si può rilevare un problemi di logica.

    Traducendo lo script in umanese:

    - Ciclo tutti i checkbox
    - Considero solo quelli che NON sono già mostrati sulla pagina (dal momento che quelli visibili sulla pagina sono già considerati come dati da inviare col form)
    - Per ognuno di quelli non mostrati, verifico se è selezionato
    - Se lo è, allora creo una sua copia hidden nel form (così che sia considerato come dato del form)
    - Se non lo è, allora rimuovo dalla pagina TUTTI gli hidden

    Puoi capire quindi che quest'ultima azione, se l'ultimo box esaminato NON risulta selezionato, va a rimuovere comunque TUTTI gli hidden appena creati dal ciclo stesso.

    Ora, nel caso in cui si usa la funzione "seleziona tutto", l'ultimo checkbox nella tabella risulterà selezionato, e per tale motivo non avverrà quell'ultima azione.

    Invece, selezionando qualche checkbox in una singola pagina della tabella, questi saranno comunque considerati perché sono già presenti nel form; non le copie hidden che invece verrebbero erroneamente rimosse.

    Spero di aver chiarito la causa del problema, o quantomeno di non averti creato maggiore confusione

    Per risolvere, basterà spostare quell'azione prima che sia eseguito il ciclo; per cui, tutti gli hidden del form sono rimossi preventivamente, quindi sono ricreati, attraverso il ciclo, solo quelli relativi ai ceckbox selezionati e non presenti già nel DOM.

    Potrebbe essere una cosa del genere:
    codice:
    $('form').on('submit', function(e){
    
       var $form = $(this);
    
       // Rimuovo TUTTI gli input hidden del form
       $form.find("input[type='hidden']").remove();
    
       // Ciclo SOLO i checkbox selezionati della tabella
       table.$('input:checked').each(function(){
    
          // Se questo checkbox non è già nel DOM
          if (!$.contains(document, this)){
    
             // Creo la copia hidden
             $form.append(
                $('<input>')
                   .attr('type', 'hidden')
                   .attr('name', this.name)
                   .val(this.value)
             );
          }
       });
    });



    Ultima considerazione: dal momento che al submit vengono considerati i checkbox visibili sulla pagina (che siano checked oppure no), mentre gli hidden non posseggono la proprietà "checked", lato server dovrai fare attenzione a come valutare questi elementi; cioè dovrai prendere in considerazione tutti gli hidden come fossero dei checkbox checked, mentre i checkbox (che sono quelli restati visibili nella pagina) vanno verificati considerando solo i checked. Presumo tu abbia già considerato questo, in quanto valeva anche nel caso del "seleziona tutto".

    Fai sapere.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  2. #2
    Quote Originariamente inviata da KillerWorm Visualizza il messaggio
    Ho dato uno sguardo

    Prima cosa: non tenere conto di quanto ho indicato nei post precedenti. Non conoscendo il plugin ho scritto qualche castroneria facendo supposizioni errate

    In realtà la tabella viene aggiornata regolarmente quando manovri i checkbox. Gli elementi che sono mostrati a video sono esattamente parte di quelli che stanno dentro l'istanza dataTable.

    Il problema sta in quel ciclo del submit, come avevi immaginato tu.

    Analizzando meglio ciò che va a fare quello script, si può rilevare un problemi di logica.

    Traducendo lo script in umanese:

    - Ciclo tutti i checkbox
    - Considero solo quelli che NON sono già mostrati sulla pagina (dal momento che quelli visibili sulla pagina sono già considerati come dati da inviare col form)
    - Per ognuno di quelli non mostrati, verifico se è selezionato
    - Se lo è, allora creo una sua copia hidden nel form (così che sia considerato come dato del form)
    - Se non lo è, allora rimuovo dalla pagina TUTTI gli hidden

    Puoi capire quindi che quest'ultima azione, se l'ultimo box esaminato NON risulta selezionato, va a rimuovere comunque TUTTI gli hidden appena creati dal ciclo stesso.

    Ora, nel caso in cui si usa la funzione "seleziona tutto", l'ultimo checkbox nella tabella risulterà selezionato, e per tale motivo non avverrà quell'ultima azione.

    Invece, selezionando qualche checkbox in una singola pagina della tabella, questi saranno comunque considerati perché sono già presenti nel form; non le copie hidden che invece verrebbero erroneamente rimosse.

    Spero di aver chiarito la causa del problema, o quantomeno di non averti creato maggiore confusione

    Per risolvere, basterà spostare quell'azione prima che sia eseguito il ciclo; per cui, tutti gli hidden del form sono rimossi preventivamente, quindi sono ricreati, attraverso il ciclo, solo quelli relativi ai ceckbox selezionati e non presenti già nel DOM.

    Potrebbe essere una cosa del genere:
    codice:
    $('form').on('submit', function(e){
    
       var $form = $(this);
    
       // Rimuovo TUTTI gli input hidden del form
       $form.find("input[type='hidden']").remove();
    
       // Ciclo SOLO i checkbox selezionati della tabella
       table.$('input:checked').each(function(){
    
          // Se questo checkbox non è già nel DOM
          if (!$.contains(document, this)){
    
             // Creo la copia hidden
             $form.append(
                $('<input>')
                   .attr('type', 'hidden')
                   .attr('name', this.name)
                   .val(this.value)
             );
          }
       });
    });



    Ultima considerazione: dal momento che al submit vengono considerati i checkbox visibili sulla pagina (che siano checked oppure no), mentre gli hidden non posseggono la proprietà "checked", lato server dovrai fare attenzione a come valutare questi elementi; cioè dovrai prendere in considerazione tutti gli hidden come fossero dei checkbox checked, mentre i checkbox (che sono quelli restati visibili nella pagina) vanno verificati considerando solo i checked. Presumo tu abbia già considerato questo, in quanto valeva anche nel caso del "seleziona tutto".

    Fai sapere.

    Funziona tutto perfettamente , grazie mille

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 © 2026 vBulletin Solutions, Inc. All rights reserved.