Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    2,614

    impostare limite massimo per caratteri e righe su textarea

    Salve
    nel ringraziare KillerWorm per avermi fornito il seguente script, volevo sapere se c'era la possibilità di far andare a capo in automatico dopo il primo rigo a raggiungimento del limite 25 caratteri per riga che sono abbiamo impostato, grazie.
    codice:
    <!DOCTYPE HTML>
    <html>
      <head>
        <title>Esempio</title>
        <meta charset="utf-8">
      </head>
      <body>
      
        <textarea id="areatesto" name="titolo" cols="50" rows="2" ></textarea>
    
        <script type="text/javascript">
          function TestoLimitato(textarea, colonne, righe){
            var me = this;
            if (colonne<0 || righe<1) return;
            function verificaTesto(){
              RegExp('^.{0,'+(colonne)+'}(\n.{0,'+(colonne)+'}){0,'+(righe-1)+'}$','g').test(textarea.value)
                ? me.value = textarea.value
                : textarea.value = me.value
              ;
            }
            me.value = '';
            textarea.addEventListener('input', verificaTesto);
            verificaTesto();
          }
          
          new TestoLimitato(areatesto, 25, 2);
        </script>
        
      </body>
    </html>
    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    2,614
    Nessun aiuto?

  3. #3
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,684
    Ciao, personalmente sto cercando di elaborare qualcosa ma non ti nego che non è poi così semplice.
    Sto cercando di fare una sorta di split all'interno della funzione di verifica. Il problema è che in questo caso la funzione non si limita a "tenere il testo inalterato" qualora non passi il controllo, ma deve essere proprio modificato (andando ad aggiungere delle interruzioni di riga) durante la digitazione. La cosa è un po' più complessa.

    Faccio qualche altra prova ma non garantisco nulla.

    Nel caso, Attendi anche altre eventuali risposte, magari qualche altro utente si vuole cimentare nel cercare qualche soluzione o proporre degli altri suggerimenti.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  4. #4
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,684
    Bene, ho buttato giù qualcosa. Come dicevo, non è stato troppo facile. Il problema principale, oltre a suddividere la stringa secondo il limite impostato, è stato quello di reimpostare la posizione del cursore perché, di fatto, quando viene modificato da script il contenuto della textarea, la posizione del cursore normalmente si azzera (o si porta alla fine, a seconda del browser) o perde comunque la regolare posizione tenendo anche conto dei nuovi caratteri aggiunti (i ritorno a capo); va quindi ricalcolata. In realtà non sono riuscito ad ottimizzare il calcolo per alcune situazioni, ad esempio quando si utilizza il CANC a fine riga per cui il testo della riga successiva si porta in quella precedente; il cursore in tal caso si sposta in avanti di un carattere per un "errore" di calcolo che non sono riuscito a sistemare. Sono comunque errori minimi.

    Per il resto dovrebbe funzionare tutto anche se può essere chiaramente migliorato ed ottimizzato. A dire il vero, ho anche aggiunto un effetto che avvisa quando il testo non può essere modificato perché si è raggiunto il limite, ad esempio se si cerca di digitare qualcosa quando il testo occupa già la lunghezza massima o il numero di righe consentite. In tal caso il testo diventa rosso per un istante, facendo un breve flash. L'effetto è impostato tramite CSS ed eventualmente è possibile personalizzarlo o escluderlo eliminando quel CSS.

    Qui un esempio:
    codice:
    <!DOCTYPE HTML>
    <html>
      <head>
        <title>Esempio</title>
        <meta charset="utf-8">
        <style type="text/css">
          @keyframes errorblink { 0% { color: red; } 100% { color: #000; } }
          .errorblink { animation: errorblink 500ms 1 ease; }    
        </style>
      </head>
      <body>
        <textarea id="areatesto" cols="50" rows="4" ></textarea>
        <script type="text/javascript">
          function TestoLimitato(textarea, colonne, righe, autoNewLine){
            var obj = this;
            if (colonne<0 || righe<1) return;
            function verificaTesto(){
              var str = this.value
                , lunghezzaInput = this.value.length - obj.value.length
                , nuovaPosizioneCursore = this.selectionStart
                , posizioneCursorePrimaDellaModifica = nuovaPosizioneCursore - lunghezzaInput
                , newLines = 0
              ;
              if (str && autoNewLine) {
                // Inserimento automatico dei ritorno a capo
                str = str.replace(RegExp('.{'+(colonne)+'}(?=[^\n])','g'),'$&\n');
                newLines = str.split("\n").length - this.value.split('\n').length;
                nuovaPosizioneCursore = this.selectionStart + newLines;
                this.value = str;
              }
              // Verifico se la modifica effettuata rispetta i limiti impostati
              if (RegExp('^.{0,'+(colonne)+'}(\n.{0,'+(colonne)+'}){0,'+(righe-1)+'}$','g').test(str)) {
                // Modifica avvenuta
                obj.value = str;
              } else {
                // Errore, non è possibile mantenere questa modifica, sarà ripristinato il precedente valore
                this.value = obj.value;
                nuovaPosizioneCursore = posizioneCursorePrimaDellaModifica;
                this.classList.remove('errorblink');
                setTimeout(function(){textarea.classList.add('errorblink');},1);
              }
              this.selectionStart = this.selectionEnd = nuovaPosizioneCursore;
            }
            obj.value = '';
            textarea.addEventListener('input', verificaTesto);
            verificaTesto.call(textarea);
          }
          new TestoLimitato(areatesto, 25, 2, true);
        </script>
      </body>
    </html>
    Per abilitare il ritorno a capo automatico, ho impostato un quarto parametro booleano da passare alla funzione. Basta quindi specificare true per abilitarlo (vedi esempio).

    Testato su Win10 con FF46, CH57, ED20, IE11, O44

    Per il momento è tutto.
    Buon proseguimento.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    2,614
    Grazie 1000 KillerWorm
    funziona alla grande

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    2,614
    Killerworm, ho notato che all' obj. value (di base vuoto) metto un dato recuperato tipo:
    codice:
    obj.value = '<%=rs.fields("nome")%>';
    Purtroppo non rispetta più ne caratteri minimi ne quantomeno l'accapo, come se bloccasse la funzione.
    Da cosa può dipendere?
    Grazie

  7. #7
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,684
    Non so, ma teoricamente dentro la funzione TestoLimitato() non dovrebbe essere toccato nulla, perché quello è il costruttore dell'oggetto TestoLimitato.
    Quello che puoi impostare sta nella dichiarazione dell'istanza di quell'oggetto:
    codice:
    new TestoLimitato(areatesto, 25, 2, true);
    dove puoi passare giusto quei 4 argomenti.

    Se invece vuoi impostare un valore di default, per la textarea, puoi metterlo direttamente nel codice html:
    codice:
    <textarea id="areatesto" cols="50" rows="4" ><%=rs.fields("nome")%></textarea>
    Chiaramente questo contenuto deve rispettare i limiti impostati per tale elemento, perché la funzione viene lanciata una prima volta inizialmente e se la stringa non rispetta i limiti, viene azzerata; cioè, in sostanza viene usato il valore iniziale dell'oggetto, che dovrebbe appunto essere una stringa vuota obj.value = '';
    Installa Forum HTML.it Toolset per una fruizione ottimale 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.