Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2016
    Messaggi
    39

    Selezionare una porzione di stringa

    Ciao a tutti, sto cercando di riuscire a selezionare una porzione di stringa, all'interno di una textarea, che sia compresa tra parentesi.
    Esempio:
    codice:
    <textarea>
    Questa è una stringa casuale e (questa è la porzione) da estrarre.
    </textarea>
    Quando clicco sulla textarea si dovrebbe selezionare automaticamente la parte di testo:
    (questa è la porzione) comprese le parentesi...

    Per quel poco che so di javascript ho pensato di ricavare la posizione delle 2 parentesi con questi codici:
    codice:
    var poStr1=this.value.indexOf("(");
    var poStr2=this.value.indexOf(")");
    Una volta che ho le posizioni dovrei riuscire a sfruttarle per poter selezionare quello che a me serve, ho fatto bene fino a qui?
    Il problema è che ora non so come procedere, avete qualche idea?

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Ciao.
    Per quel poco che so di javascript ho pensato di ricavare la posizione delle 2 parentesi con questi codici:
    ho fatto bene fino a qui?
    Sì, può andare bene a parte che dovrai incrementare di 1 il valore della posizione finale, in modo da portare la selezione oltre l'ultima parentesi e questa sia quindi compresa.

    Il problema è che ora non so come procedere, avete qualche idea?
    Per la selezione del testo (in generale) puoi usare le funzioni focus() (in modo da attivare l'elemento, se non lo fosse, per poter effettuare la selezione) e setSelectionRange(). Nella tua precedente richiesta ti ho già fornito tutti gli spunti necessari per poter ottenere ciò che stai chiedendo qui.

    Hai dato uno sguardo ai link che ti ho suggerito in quella discussione?
    Hai provato ad impostare qualcosa?

    Io potrei postarti un esempio completo e già pronto, ma ti suggerisco comunque di provare a fare prima qualcosa tu. Se poi non riesci puoi postare il codice che hai provato e chiedere ulteriori consigli qui sul forum.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2016
    Messaggi
    39
    E' vero, avevo la soluzione sotto al naso.. Ho utilizzato setSelectionRange() con le posizioni delle parentesi e funziona.
    Ora vorrei fare un'ultima cosa:
    Cancellare il testo selezionato ma anziché usare Canc su tastiera, vorrei utilizzare il tasto destro del mouse, del tipo che mi basta fare clic col tasto dx sulla textarea e la selezione deve cancellarsi come se premessi Canc.
    Ho fatto una ricerca e credo di dover usare onContextMenu ma non riesco a farlo funzionare.
    Sai aiutarmi?

  4. #4
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Sì, per l'evento del click destro puoi usare oncontextmenu (in genere, scritto tutto minuscolo).
    Questo però andrà ad aprirti il menu contestuale per cui, se non ti serve visualizzarlo, dovrai disabilitarlo. Puoi farlo passando return false; all'interno del gestore di evento.

    Non capisco però perché vorresti usare questo sistema e quale sia il tuo reale obiettivo.

    Inoltre, perché vai a selezionare la porzione di testo se poi devi semplicemente cancellarla?
    Ti serve realmente a qualcosa creare una selezione sul testo?
    Diversamente potresti agire direttamente sul testo usando, ad esempio, un replace() magari con una espressione regolare o dei sistemi analoghi per eliminare al volo la porzione (o le porzioni) del testo.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2016
    Messaggi
    39
    Sto facendo esperimenti ma non riesco a capire come assegnare al pulsante dx del mouse il tasto Canc o anche Backspace.
    Puoi illuminarmi?

    Il replace non lo uso perché non sempre devo eliminare quella sezione di testo, a volte va lasciata... Quindi devo fare il controllo manuale.
    Ma siccome sono tante le textarea da controllare, per velocizzare il più possibile avevo pensato a questo stratagemma di usare solo il mouse senza passare sulla tastiera ed eliminare manualmente il contenuto delle parentesi, laddove necessario.

  6. #6
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Ok, ma ancora non mi è chiaro l'obiettivo esatto e il contesto in cui devi adoperare tale script. Ho alcune perplessità sul metodo che intendi utilizzare.

    Per simulare la pressione di un tasto, della tastiera, si adoperano delle funzioni che differiscono a seconda del browser utilizzato. Personalmente, se proprio dovessi optare per una scelta del genere, utilizzerei jQuery ma non senza prima aver verificato l'effettiva necessità e valutato altre soluzioni. Chiaramente è solo una mia opinione personale.

    Ad ogni modo vorrei capire meglio se magari ti si può consigliare una soluzione più ottimale.

    Il replace non lo uso perché non sempre devo eliminare quella sezione di testo, a volte va lasciata...
    Quali sono i criteri per cui decidi di eliminare o meno quelle porzioni di testo?
    Hai dei parametri di riferimento che puoi applicare in modo programmatico?
    Se così fosse si potrebbe utilizzare, come accannato, una qualche espressione regolare ed eventualmente ciclare tutti i testi in modo automatico.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2016
    Messaggi
    39
    Purtroppo non si può creare nessun algoritmo che sia in grado di stabilire quando togliere quella porzione e quando lasciarla. Perchè al suo interno ci sono semplici parole della lingua italiana, quindi serve l'intelligenza di una persona per valutare il da farsi, caso per caso.
    Ecco perchè avevo pensato di simulare, a seguito della selezione, la pressione di Canc.
    Io come browser ho google chrome, ad ogni modo se javascript lo conosco poco, jQuery per niente.

  8. #8
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Ok, prendo per buono ciò che mi dici.

    Qualche altra domanda prima di proporti una eventuale soluzione:

    - Devi controllare diverse textarea sulla stessa pagina?
    - Nel caso di più textarea, devi poterle selezionare (cioè cliccarci sopra) singolarmente per poter procedere con la selezione/eliminazione delle porzioni di testo?
    - Il criterio di selezione del testo è sempre quello del blocco di testo racchiuso tra parentesi tonde?
    - Hai un solo blocco di parentesi per ogni textarea oppure possono essere di più?
    - Nel caso, all'interno di una stessa textarea, devi poter selezionare/valutare/eliminare ogni singolo blocco o tutti assieme?

    - Puoi fare un esempio concreto?
    - Hai una pagina pubblica dove poter capire cosa ti serve ottenere di preciso?

    Ecco perchè avevo pensato di simulare, a seguito della selezione, la pressione di Canc.
    Non che non si possa risolvere anche col click del mouse ma posso sapere perché trovi poco pratico premere il Canc dalla tastiera?

    Sia chiaro, il mio non vuole essere un interrogatorio ma sto cercando di capire il contesto (che ancora non ho chiaro) in cui ti serve usare questa roba, in modo da poterti indirizzare al meglio verso una possibile soluzione. Se poi tu ritieni che la tua idea di partenza sia quella giusta e intendi continuare su quella, allora non mi cimento nemmeno a proporti delle alternative. L'importante è saperlo.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2016
    Messaggi
    39
    - Devi controllare diverse textarea sulla stessa pagina?
    Si
    - Nel caso di più textarea, devi poterle selezionare (cioè cliccarci sopra) singolarmente per poter procedere con la selezione/eliminazione delle porzioni di testo?
    Si ci devo cliccare singolarmente sopra su tutte
    - Il criterio di selezione del testo è sempre quello del blocco di testo racchiuso tra parentesi tonde?
    Si
    - Hai un solo blocco di parentesi per ogni textarea oppure possono essere di più?
    Possono essercene di più
    - Nel caso, all'interno di una stessa textarea, devi poter selezionare/valutare/eliminare ogni singolo blocco o tutti assieme?
    Solo l'ultimo blocco, ma questo l'ho già risolto.

    - Puoi fare un esempio concreto?
    <textarea>Questo è un normalissimo testo che sta dentro la textarea e (questo è ciò che forse devo togliere).</textarea>

    Non che non si possa risolvere anche col click del mouse ma posso sapere perché trovi poco pratico premere il Canc dalla tastiera?
    A questo avevo risposto. Praticamente le textarea sono tante, quindi per velocizzare il più possibile l'ìoperazione avevo pensato di fare tutto col mouse, senza ogni volta dover passare la mano dal mouse alla tastiera e viceversa.

  10. #10
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    A questo avevo risposto. Praticamente le textarea sono tante, quindi per velocizzare il più possibile l'ìoperazione avevo pensato di fare tutto col mouse, senza ogni volta dover passare la mano dal mouse alla tastiera e viceversa.
    Senza offesa, sei per caso monco o hai qualche particolare problema ad usare una mano sulla tastiera e una sul mouse?
    E' giusto una mia curiosità.

    Ad ogni modo ti posto qui un esempio completo e funzionante.
    Tieni presente che ho trovato problemi nel far innescare l'evento di pressione di un tasto della tastiera al click dx del mouse. In particolare ho trovato problemi proprio su CH, relativi al mantenimento della selezione del testo quando avviene l'evento oncontextmenu. Ho comunque mantenuto quella linea guida senza passare però per il canc.
    Trovi commenti e note sul codice, se comunque hai bisogno di ulteriori chiarimenti, chiedi pure.
    codice:
    <!DOCTYPE HTML>
    <html>
      <head>
        <title>Esempio</title>
        <meta charset="utf-8">
        <style type="text/css">
          textarea{
            width:400px;
            height:200px;
          }
        </style>
      </head>
      <body>
        <textarea>Questa è una stringa casuale e (questa è la porzione) da estrarre.</textarea>
        <textarea>Qui ci sono più porzioni(tra parentesi), quindi sarà selezionata solo (l'ultima porzione).</textarea>
        <textarea>Qui non ci sono porzioni tra parentesi. Non seleziono nulla</textarea>
        <textarea>Qui c'è una parentesi aperta ( ma manca quella chiusa. Sara selezionata solo quella parentesi</textarea>
        <textarea>Qui invece c'è qualche )incongruenza( tra le parentesi. Tra vedere e non vedere, seleziono giusto l'ultima parentesi trovata</textarea>
        <textarea>Altro caso (di) incongruenza (. Seleziono sempre l'ultima parentesi trovata</textarea>
        <script type="text/javascript">
          var txt = document.getElementsByTagName('textarea')                       // NodeList degli elementi textarea
            , i = txt.length                                                        // lunghezza del NodeList
          ;
          while (i--) {                                                             // Ciclo gli elementi
            var e = txt[i];                                                         // Elemento corrente
            e.onclick = selezionaPorzioneTesto;                                     // Sull'evento click sx applico la funzione di selezione
            e.oncontextmenu = rimuoviPorzioneTesto;                                 // Sull'evento click dx applico la funzione di rimozione
          }
          
          function selezionaPorzioneTesto(){                                        // Funzione di selezione della porzione di testo tra parentesi
            var e = this                                                            // L'elemento su cui ho cliccato
              , p1 = e.value.lastIndexOf('(')                                       // Posizione inizio selezione - ultima parentesi aperta
              , p2 = e.value.lastIndexOf(')')+1                                     // Posizione fine selezione - ultima parentesi chiusa (compresa)
            ;
            if (p1 == -1) p1 = p2-1;                                                // Se la posizione iniziale non è definita, faccio riferimento a quella finale
            p2 = Math.max(p1+1,p2);                                                 // Per eventuali incongruenze correggo la posizione finale in modo che comprenda solo l'ultima parentesi trovata
            if (p1+p2!=-1){                                                         // Se è presente almeno una parentesi eseguo la selezione
              e.selectionStart = p1;                                                // Inizio selezione
              e.selectionEnd = p2;                                                  // Fine selezione
            }
          }
          
          function rimuoviPorzioneTesto(ev){                                        // Funzione di rimozione della porzione di testo tra parentesi
            var e = this                                                            // L'elemento su cui ho cliccato
              , str = e.value                                                       // L'intera stringa di testo
              /* NOTA:
                Ho provato a recuperare le posizioni in base all'effettiva selezione.
                Su FF funziona ma ho problemi su CH e IE9 in cui al click dx, se il puntatore del mouse non sta esattamente sopra il testo selezionato,
                le posizioni della selezione sono ridefinite istantaneamente in base alla posizione corrente del puntatore.
                Questa soluzione quindi non è troppo affidabile.
                
              , p1 = e.selectionStart                                               // Recupero la posizione iniziale della porzione selezionata
              , p2 = e.selectionEnd                                                 // Recupero la posizione finale della porzione selezionata
              
                Recupero quindi le posizioni con lo stesso criterio usato per effettuare la selezione.
                Significa che, anche se non c'è un'effettiva selezione, la porzione di testo sarà comunque rimossa. 
                Chiaramente il tutto potrebbe essere ottimizzato inserendolo dentro una funzione a parte.
              */
              , p1 = e.value.lastIndexOf('(')
              , p2 = e.value.lastIndexOf(')')+1
            ;
            if (p1 == -1) p1 = p2-1;
            p2 = Math.max(p1+1,p2);
            if (p1+p2!=-1){
              e.value = str.slice(0, p1) + str.slice(p2);                           // Ricompongo la stringa senza il blocco di parentesi
              e.selectionStart = e.selectionEnd = p1;                               // Riposiziono il cursore nel punto di rimozione; diversamente, dopo la modifica, andrebbe in fondo al testo
                                                                                    // Inibisco la comparsa del menu contestuale
            ev.preventDefault();
            ev.stopPropagation();
            return false;
            }
          }
        </script>
      </body>
    </html>
    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 © 2025 vBulletin Solutions, Inc. All rights reserved.