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

    document.getSelection()

    Ho un elemento input dove lato js faccio dei controlli per impedire l'inserimento di più di 3 caratteri, se l'utente tenta di inserire il quarto carattere, la funzione restituisce false e il carattere non entra proprio.
    In tutto ciò c'è un problema, se l'utente inserisce 3 caratteri poi seleziona i 3 caratteri e tenta di inserire del nuovo testo (sovrascrittura) è bloccato lo stesso.
    Quindi pensavo per risolvere il problema di fare un controllo del testo selezionato nell'elemento di input ed ho utilizzato document.getSelection(), ma lavora solo su Chrome; ho le ultime versioni di browser.
    Sapete come scrivere qualcosa che sia cross browser?
    Grazie.

  2. #2
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998
    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

  3. #3
    Ciao br1 e grazie per la risposta, non posso utilizzare la tua soluzione, mi spiego meglio quindi, perchè quello che devo fare è più complesso. Ho un campo input dove devo controllare che l'immissione dei dati rispetti determinate regole:
    Il campo accetta solo numeri e virgole, non si può cominciare con una virgola, due virgole non possono mai essere vicine, le cifre che compongono i numeri possono essere al massimo di 3, quindi ogni numero può essere di 1, 2 o 3 cifre, ogni numero deve esse separato da una virgola, i numeri possono essere infiniti (quindi non posso utilizzare maxlength).

    Esempio di inserimento valido: 5,41,548,999,1

    Ho già scritto lo script che fa questo e l'unico problema che mi rimane in sospeso è quello della mia domanda, quindi ti chiedo, hai una soluzione alla mia prima domanda?
    Ti posto il codice per completezza:

    codice:
    /* keypress mi permette di lavorare sul tasto premuto ancor prima che il carattere venga scritto nell'elemento di input
       le ripetizioni possono essere numeri secchi da massimo 3 cifre, oppure  dei ladder che hanno sempre massimo 3 cifre e sono separati da virgola  per un numero infinito di volte
      1,5,40,345,98, ... */
      $(".ripetizioni").keypress(function(e)
      {            
        //recupero quello che attualmente è stato inserito nell'input    
        var input = $(this).val();
        // ottengo la posizione del cursore nell'elemento di input 
        var cursor = $(this).prop("selectionStart");
        // lavoro solo se il primo carattere non è una virgola (44)
        if (e.which != 44 || cursor != 0)
        {
           /* con e.which controllo il tasto premuto ancor prima di vederlo  scritto nell'elemento di input, controllo che il carattere sia un numero  (48~57),
          oppure canc (0), oppure backspace (8), oppure una  virgola (44), se non è uno di questi, la funzione termina subito senza  stampare nulla nell'input */ 
          if (e.which >= 48 && e.which <= 57 || e.which == 0 || e.which == 8 || e.which == 44)
          {
             /* String.fromCharCode(e.which) mi converte il tasto premuto (codice  ascii) nella lettera corrispondente, il controllo if qui sotto dice che  se
            c'è una virgola nell'elemento di input e il cursore è vicino ad essa (o prima o dopo) e il tasto premuto è una virgola, 
            allora ho un caso di virgola-virgola (che non ammetto), quindi esco dalla funzione senza stampare nulla nell'input */  
             if (input.substr(cursor - 1, 1) + String.fromCharCode(e.which) != ",,"  && input.substr(cursor, 1) + String.fromCharCode(e.which) !=  ",,")
            {
              /* l'espressione qui sotto prende il  contenuto già presente nell'elemento di input ed in più ci aggancia il  tasto che sta per entrare da keypress,
              sostanzialmente mi ricostruisce la stringa completa che sta per essere stampata nell'elemento di input */
              stringa = input.substr(0, cursor) + String.fromCharCode(e.which) + input.substr(cursor);
              // creo un vettore con tutte le cifre tra le virgole
              var numeri = stringa.split(",");
              var notok;
               /* analizzo numero per numero (anche se rileggere tutti i numeri è un  controllo oneroso e superfluo, sarebbe stato ancora più complicato  analizzare solo quello che 
              sta intorno (nell'input) al tasto in entrata da keypress) */
              $.each(numeri, function(index, value)
              {
                 // ammetto solo numeri con lunghezza di cifre da 1 a 3, se il valore è  maggiore di 3 cifre significa che in entrata su keypress c'è un quarto  numero 
                if (value.length > 3)
                  notok = true;
              }); 
              // quindi se c'è un quarto numero termino la funzione senza stampare nulla
              if (notok)
                return false;
              else 
                return true;
            }
            else
              return false;
          }
          else
            return false;
        }
        else
          return false;
      });
    Ultima modifica di valerio.risa; 13-08-2019 a 21:01 Motivo: tag [code]

  4. #4
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998
    Ti scrivo un esempio in js "puro" senza librerie, rimane da gestire l'eventuale ultima virgola al termine dell'immissione. Adattalo alle tue pagine.
    codice:
    <script>
    ov='';
    re = /^(\d{1,3}\,)*\d{0,3}$/
    function pippo(obj) {
     nv = obj.value;
     if(re.test(nv)) {ov=nv}else{obj.value = ov;}
    } 
    </script>
    <input onkeyup="pippo(this)">
    ps: rileggendo il titolo e la direzione presa dalla discussione si capisce come a volte il problema che si intende risolvere non e' quello descritto all'inizio
    Ultima modifica di br1; 16-08-2019 a 12:15
    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

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