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

    problema di passaggio di tutte le variabili in un ciclo for

    ciao a tutti,


    semplifico il mio problema al minimo poiché in realtà il mio codice è ahimè molto complesso.


    ho due campi input text, nel primo campo posso inserire una serie di valori, mentre il secondo campo riceve i valori del primo campo e li confronta con quelli che già possiede. se ci sono dei valori doppi la funzione avvisa e l'utente può scegliere se sovrascriverli oppure cancellarli, altrimenti il valore viene aggiunto.


    voglio fare questo tramite un ciclo for.




    codice:
    
    
    <input id="valoredainserire" value="" type="text"><br> <!-- scrivo per esempio: "pere; mele; banane" -->
    
    
    <input id="valoredacambiare" value="pere; cipolle; mele; " type="text" readonly>
    
    
    <input type="button" onclick="prova();" value="Prova">
    
    
    <script>
    function prova(){
    var stringa_valoredainserire = document.getElementById("valoredainserire").value;
    
    
    var stringa_valoredacambiare = document.getElementById("valoredacambiare").value;
    var stringa_valoredacambiare2 = document.getElementById("valoredacambiare");
    
    
    mioarray = stringa_valoredainserire.split("; ");
    var i, len, text;	
    
    
    //inizio ciclo for														
    for (i = 0, len = mioarray.length, text = ""; i < len; i++) {
    
    
    if(stringa_valoredacambiare.indexOf(mioarray[i]) !== -1){
    
    
    if(confirm('il valore '+ mioarray[i] +' esiste, ok per sovrascriverlo, annulla per cancellarlo')){
    stringa_valoredacambiare2.value = stringa_valoredacambiare.replace(mioarray[i], mioarray[i]);
    
    
    }
    else{
    stringa_valoredacambiare2.value = stringa_valoredacambiare.replace(mioarray[i] +'; ', '');
    
    
    }
    
    
    }
    else{
    stringa_valoredacambiare2.value = stringa_valoredacambiare2.value + mioarray[i] +'; ';
    }
    }
    }
    </script>
    
    
    
    



    il problema è che se i valori da inserire nel primo campo input sono uguali ai valori del secondo, qualora io li volessi cancellare, la funzione mi cancella solo l'ultimo, perché è l'ultima variabile che tiene in memoria.


    come posso ovviare a questa situazione? qualche idea? grazie in anticipo.
    Ultima modifica di Delgadinho; 23-05-2019 a 15:00

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Ciao, il problema sta nel fatto che stai usando stringa_valoredacambiare per eseguire il replace e quindi aggiornare il valore corrente di stringa_valoredacambiare2, non tenendo conto però che il replace non modifica il valore originale della variabile a cui è applicato (cioè stringa_valoredacambiare resta sempre invariata), per questo ogni volta che esegui quell'azione non stai tenendo conto delle precedenti modifiche eseguite nel ciclo.

    Dovresti utilizzare sempre il valore corrente di quell'elemento (stringa_valoredacambiare2) in modo da tenere conto di tutte le modifiche effettuate nel ciclo.

    Inoltre c'è qualcosa qui che mi suona strano o quantomeno inutile:
    codice:
    replace(mioarray[i], mioarray[i])
    Non ha senso rimpiazzare un valore con lo stesso identico valore; ma posso pensare che tu abbia tralasciato qualcosa nell'esempio postato qui, come hai premesso.

    Personalmente rivedrei la funzione in questo modo:
    Crea i due array per i valori dei due campi, quindi eseguo il ciclo sui valori inseriti e modifico l'array dei valori modificati secondo le operazioni che avvengono nel ciclo. Alla fine del ciclo riassemblo i valori dell'array modificato per aggiornare il valore del relativo campo.

    Qui lo script rielaborato e commentato (ho aggiunto anche qualche altra cosa per renderlo più robusto):
    codice:
    function prova() {
       var fldValoriInseriti = document.getElementById('valoredainserire');                // Campo valori inseriti
       var fldValoriEsistenti = document.getElementById('valoredacambiare');               // Campo valori esistenti
       
    	var arrValoriInseriti = fldValoriInseriti.value.split(/ *; */).filter(Boolean);     // Array valori inseriti (ripulito da spazi superflui e valori vuoti)
    	var arrValoriEsistenti = fldValoriEsistenti.value.split(/ *; */).filter(Boolean);   // Array valori esistenti (ripulito da spazi superflui e valori vuoti)
       
       arrValoriInseriti.forEach((val)=>{                                                  // Ciclo i valori inseriti
          var idValoreEsistente = arrValoriEsistenti.indexOf(val);
          if (idValoreEsistente !== -1) {                                                  // Se questo valore è presente tra quelli esistenti
                                                                                           // Chiedo se mantenerlo o rimuoverlo
             if (!confirm('Il valore "' + val + '" è già presente. Cosa si desidera fare?\n\n - [OK] mantieni\n - [Annulla] rimuovi')){
                arrValoriEsistenti.splice(idValoreEsistente, 1);
             }
          } else {                                                                         // Se questo valore non è presente tra quelli esistenti
             arrValoriEsistenti.push(val);                                                 // Lo aggiungo
          }
       });
       fldValoriEsistenti.value = arrValoriEsistenti.join('; ');                           // Aggiorno il campo fldValoriEsistenti
    }
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  3. #3
    Quote Originariamente inviata da KillerWorm Visualizza il messaggio
    Ciao, il problema sta nel fatto che stai usando stringa_valoredacambiare per eseguire il replace e quindi aggiornare il valore corrente di stringa_valoredacambiare2, non tenendo conto però che il replace non modifica il valore originale della variabile a cui è applicato (cioè stringa_valoredacambiare resta sempre invariata), per questo ogni volta che esegui quell'azione non stai tenendo conto delle precedenti modifiche eseguite nel ciclo.

    Dovresti utilizzare sempre il valore corrente di quell'elemento (stringa_valoredacambiare2) in modo da tenere conto di tutte le modifiche effettuate nel ciclo.

    Inoltre c'è qualcosa qui che mi suona strano o quantomeno inutile:
    codice:
    replace(mioarray[i], mioarray[i])
    Non ha senso rimpiazzare un valore con lo stesso identico valore; ma posso pensare che tu abbia tralasciato qualcosa nell'esempio postato qui, come hai premesso.

    Personalmente rivedrei la funzione in questo modo:
    Crea i due array per i valori dei due campi, quindi eseguo il ciclo sui valori inseriti e modifico l'array dei valori modificati secondo le operazioni che avvengono nel ciclo. Alla fine del ciclo riassemblo i valori dell'array modificato per aggiornare il valore del relativo campo.

    Qui lo script rielaborato e commentato (ho aggiunto anche qualche altra cosa per renderlo più robusto):
    codice:
    function prova() {
       var fldValoriInseriti = document.getElementById('valoredainserire');                // Campo valori inseriti
       var fldValoriEsistenti = document.getElementById('valoredacambiare');               // Campo valori esistenti
       
        var arrValoriInseriti = fldValoriInseriti.value.split(/ *; */).filter(Boolean);     // Array valori inseriti (ripulito da spazi superflui e valori vuoti)
        var arrValoriEsistenti = fldValoriEsistenti.value.split(/ *; */).filter(Boolean);   // Array valori esistenti (ripulito da spazi superflui e valori vuoti)
       
       arrValoriInseriti.forEach((val)=>{                                                  // Ciclo i valori inseriti
          var idValoreEsistente = arrValoriEsistenti.indexOf(val);
          if (idValoreEsistente !== -1) {                                                  // Se questo valore è presente tra quelli esistenti
                                                                                           // Chiedo se mantenerlo o rimuoverlo
             if (!confirm('Il valore "' + val + '" è già presente. Cosa si desidera fare?\n\n - [OK] mantieni\n - [Annulla] rimuovi')){
                arrValoriEsistenti.splice(idValoreEsistente, 1);
             }
          } else {                                                                         // Se questo valore non è presente tra quelli esistenti
             arrValoriEsistenti.push(val);                                                 // Lo aggiungo
          }
       });
       fldValoriEsistenti.value = arrValoriEsistenti.join('; ');                           // Aggiorno il campo fldValoriEsistenti
    }
    Ciao KillerWorm grazie mille il tuo codice è fantastico e funziona alla grande. ora provo ad applicarlo al mio codice, ad ogni modo penso di aver capito il meccanismo! grazie mille davvero!

  4. #4
    Quote Originariamente inviata da KillerWorm Visualizza il messaggio
    Ciao, il problema sta nel fatto che stai usando stringa_valoredacambiare per eseguire il replace e quindi aggiornare il valore corrente di stringa_valoredacambiare2, non tenendo conto però che il replace non modifica il valore originale della variabile a cui è applicato (cioè stringa_valoredacambiare resta sempre invariata), per questo ogni volta che esegui quell'azione non stai tenendo conto delle precedenti modifiche eseguite nel ciclo.

    Dovresti utilizzare sempre il valore corrente di quell'elemento (stringa_valoredacambiare2) in modo da tenere conto di tutte le modifiche effettuate nel ciclo.

    Inoltre c'è qualcosa qui che mi suona strano o quantomeno inutile:
    codice:
    replace(mioarray[i], mioarray[i])
    Non ha senso rimpiazzare un valore con lo stesso identico valore; ma posso pensare che tu abbia tralasciato qualcosa nell'esempio postato qui, come hai premesso.

    Personalmente rivedrei la funzione in questo modo:
    Crea i due array per i valori dei due campi, quindi eseguo il ciclo sui valori inseriti e modifico l'array dei valori modificati secondo le operazioni che avvengono nel ciclo. Alla fine del ciclo riassemblo i valori dell'array modificato per aggiornare il valore del relativo campo.

    Qui lo script rielaborato e commentato (ho aggiunto anche qualche altra cosa per renderlo più robusto):
    codice:
    function prova() {
       var fldValoriInseriti = document.getElementById('valoredainserire');                // Campo valori inseriti
       var fldValoriEsistenti = document.getElementById('valoredacambiare');               // Campo valori esistenti
       
        var arrValoriInseriti = fldValoriInseriti.value.split(/ *; */).filter(Boolean);     // Array valori inseriti (ripulito da spazi superflui e valori vuoti)
        var arrValoriEsistenti = fldValoriEsistenti.value.split(/ *; */).filter(Boolean);   // Array valori esistenti (ripulito da spazi superflui e valori vuoti)
       
       arrValoriInseriti.forEach((val)=>{                                                  // Ciclo i valori inseriti
          var idValoreEsistente = arrValoriEsistenti.indexOf(val);
          if (idValoreEsistente !== -1) {                                                  // Se questo valore è presente tra quelli esistenti
                                                                                           // Chiedo se mantenerlo o rimuoverlo
             if (!confirm('Il valore "' + val + '" è già presente. Cosa si desidera fare?\n\n - [OK] mantieni\n - [Annulla] rimuovi')){
                arrValoriEsistenti.splice(idValoreEsistente, 1);
             }
          } else {                                                                         // Se questo valore non è presente tra quelli esistenti
             arrValoriEsistenti.push(val);                                                 // Lo aggiungo
          }
       });
       fldValoriEsistenti.value = arrValoriEsistenti.join('; ');                           // Aggiorno il campo fldValoriEsistenti
    }
    e infatti è perfettooooooo! grazie grazie 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.