Il primo numero viene inserito quando si digita l'ultimo numero nella casella di testo


14

Quando scrivo l' ultimo numero , il primo numero va dentro text-box(scompare), aggiunge uno spazio extra.

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Dopo aver fatto clic all'esterno text-box, sembra che sia necessario durante la digitazione dell'ultimo carattere. inserisci qui la descrizione dell'immagine

  #number_text {
        padding-left: 9px;
        letter-spacing: 31px;
        border: 0;
        background-image: linear-gradient(to right, #e1e1e1 70%, rgba(255, 255, 255, 0) 0%);
        background-position: left bottom;
        background-size: 38px 1px;
        background-repeat: repeat-x;
        width: 220px;
        box-sizing: border-box;
        outline:none;
    }
<input type="text" id="number_text" maxlength="6"  pattern="\d{6}" value="1234" >

Aiutami a uscire da questo problema. Grazie


Spiacenti, ma non capisco il problema?
evolutionxbox

1
Sembra che tu debba renderlo un po 'più ampio per gestire il carot dell'ultimo personaggio.
freedomn-m

@evolutionxbox mi ha richiesto un minuto o due ... lo snippet dimostra bene il problema: è una casella di input con una grande spaziatura tra le lettere. Fai clic alla fine dell'input e digita - si ferma a 6, ma 1(il primo carattere) si perde a sinistra dell'input (sfogliato con overflow nascosto).
freedomn-m

Stesso problema, ma nessuna risposta che funziona a corrente Chrome (almeno): stackoverflow.com/questions/8961045/...
freedomn-m

Suggerirei di usare 6 inputcontrolli separati e di spostare il cursore tra di loro mentre un personaggio viene digitato / eliminato. Altrimenti avrai sempre problemi di allineamento tra browser / dimensioni dei caratteri / livelli di zoom ecc.
Rory McCrossan,

Risposte:


6

Aggiungi spazio per un altro numero e taglia l'ingresso usando clip-path

#number_text {
  padding-left: 9px;
  letter-spacing: 31px;
  border: 0;
  background: 
    repeating-linear-gradient(to right, #e1e1e1 0 26px, transparent 26px 38px)
    bottom/100% 1px no-repeat;
  width: 260px;
  clip-path:polygon(0 0, calc(100% - 38px) 0, calc(100% - 38px) 100%, 0 100%);
  box-sizing: border-box;
  outline: none;
}
<input type="text" id="number_text" maxlength="6" pattern="\d{6}" value="1234">

O senza tracciato di ritaglio riducendo la dimensione dello sfondo:

#number_text {
  padding-left: 9px;
  letter-spacing: 31px;
  border: 0;
  background: 
    repeating-linear-gradient(to right, #e1e1e1 0 26px, transparent 26px 38px)
    bottom left/calc(100% - 38px) 1px no-repeat;
  width: 260px;
  box-sizing: border-box;
  outline: none;
}
<input type="text" id="number_text" maxlength="6" pattern="\d{6}" value="1234">


Il primo funziona bene, nel secondo puntatore è visibile.
Jignesh Panchal,

@JigneshPanchal Lo so, ho dato due idee diverse. Forse qualcuno vuole avere il cursore visibile
Temani dopo il

E nella prima soluzione ~ clip-path ~ non funzionerà in tutti i browser.
Jignesh Panchal,

@JigneshPanchal a meno che tu non stia usando dead broswer, il percorso clip è supportato da tutti i browser moderni ( caniuse.com/#feat=css-clip-path )
Temani Afif

3

Usa questo codice è ben fatto

var container = document.getElementsByClassName("wrap")[0];
    container.onkeyup = function(e) {
        var target = e.srcElement;
        var maxLength = parseInt(target.attributes["maxlength"].value, 6);
        var myLength = target.value.length;
        if (myLength >= maxLength) {
            var next = target;
            while (next = next.nextElementSibling) {
                if (next == null)
                    break;
                if (next.tagName.toLowerCase() == "input") {
                    next.focus();
                    break;
                }
            }
        }
     else if (myLength <= maxLength)
      {
        prev=target.previousElementSibling;
         while (prev = prev) {
            if (prev == null)
                break;
            if (prev.tagName.toLowerCase() == "input") {
                prev.focus();
                break;
            }
        }
      }

    }
.wrap input {
            border-top: 0;
            border-left: 0;
            border-right: 0;
            border-bottom: 1px solid #000;
            width: 3%;
            display: inline-block;
            outline: 0;
            text-align: center;
        }
<div class="wrap">
        <input type="text" maxlength="1" />
        <input type="text" maxlength="1" />
        <input type="text" maxlength="1" />
        <input type="text" maxlength="1" />
        <input type="text" maxlength="1" />
        <input type="text" maxlength="1" />
    </div>


Grazie per un'ottima soluzione, ma è un problema quando si utilizza backspace per rimuovere il numero dopo aver inserito i numeri. Questo problema non si verifica nel testo di input singolo.
Jignesh Panchal,

aggiungi questo codice ad altra parte di if in else if (myLength <= maxLength) { prev=target.previousElementSibling; while (prev = prev) { if (prev == null) break; if (prev.tagName.toLowerCase() == "input") { prev.focus(); break; } } }
Sreeraj_ms

@jigneshpanchalmj se il tuo problema è stato risolto, quindi correggi la mia risposta.
Rameez Bukhari,

1
Sebbene risolva il problema del segnaposto, questa soluzione richiede molto più lavoro per renderla utilizzabile. ad es. fare clic sul 3o input e digitare - va al 3o (potrebbe essere quello che si desidera) - quindi fare clic sul 2o e digitare un numero diverso due volte - va al 2o ma il 3o input viene ignorato. Quindi cursore sinistro indietro - il cursore viene ignorato (o più specificamente ripristinato). Forse va bene, ma non mi sento molto bene così com'è.
freedomn-m

parseInt(target.attributes["maxlength"].value, 6);"6" non è un valore predefinito, è la base per convertire int
freedomn-m

2

Prova ad aggiungere questo script sotto il campo di input:

<script>
  var oInput = document.getElementById('number_text');
  oInput.onkeypress = function(ev) {
    setTimeout(function() {
        if( oInput.value.length > 5 ) {
            oInput.setSelectionRange(0,0);
            oInput.blur();
        }
    }, 0);
  }
</script>

Questo forza il cursore di input all'inizio dell'input dopo l'inserimento del sesto carattere. Ho anche aggiunto una sfocatura () al campo in modo che il salto del cursore all'inizio non sporga.

È necessario anche il timeout. Senza di essa il carattere inserito verrà inserito all'inizio. Altre informazioni sul timeout: setTimeout è una buona soluzione per eseguire funzioni asincrone con JavaScript?


Forse potresti sbarazzarti di setTimeout se usi l'evento onkeyup.
Jonas Eberle,

il keyup provoca uno sfarfallio quando si attiva il tasto "su"
Jura Herber,

1

Puoi gestirlo aggiungendo un evento blur () di js onkeyup della casella di input:

myFunction=()=>{
if(document.getElementById("number_text").value.length===6)
document.getElementById("number_text").blur();
}
 #number_text {
        padding-left: 9px;
        letter-spacing: 31px;
        border: 0;
        background-image: linear-gradient(to right, #e1e1e1 70%, rgba(255, 255, 255, 0) 0%);
        background-position: left bottom;
        background-size: 38px 1px;
        background-repeat: repeat-x;
        width: 220px;
        box-sizing: border-box;
        outline:none;
        overflow-y:hidden;
        overflow-x:hidden;
    }
<input type="text" id="number_text" maxlength="6"  pattern="\d{6}" value="1234" onkeyup="myFunction()" >
<br/>


Quando inserisci l'ultimo numero, sposta tutti i numeri per qualche tempo.
Jignesh Panchal

0

Si prega di cambiare su CSS di seguito (funzionerà)

padding-left: 14px;

per

padding-left: 5px;

Ma è un problema nel design sotto il bordo del numero. e il numero non appare al centro del bordo.
Jignesh Panchal,

0

Quindi mi piace la risposta di Temani Afif sull'uso della maschera di ritaglio. Penso che sia fantastico. Volevo proporre un'altra soluzione (un po 'meno elegante). Ho usato Firefox per testare anche questo problema e facendo clic al di fuori dell'area di testo (perdendo lo stato attivo) non riappare la prima cifra o la stringa torna alla normalità nel testo inserito lì.

Credo che il problema sia l'attributo css di spaziatura tra lettere che hai impostato:letter-spacing: 31px; e il fatto che credo si applicherebbe al cursore "lampeggiante" che la maggior parte dei browser ha. Usando Chrome, sembra rimuoverlo quando perde lo stato attivo, mentre Firefox lo mantiene anche dopo aver perso lo stato attivo.

La prima soluzione consisteva nell'utilizzare manualmente la funzione di sfocatura () per far perdere la messa a fuoco dell'ingresso. Funziona in Chrome (usando una funzione anonima auto-eseguita):

<input type="text" id="number_text" maxlength="6" onkeyup="(function()
    {
      var x = document.getElementById('number_text');
      let value = x.value
      if (value.length >= 6){
        x.blur()
        return false
      }
    })();"
 pattern="\d{6}" value="1234" >

o anche come una Funzione definita chiamata dall'input number_text in questo modo:

<script>
 handleMaxInput = function(){
  var x = document.getElementById('number_text');
  let value = x.value
  if (value.length >= 6){
    x.blur()
    return false
  }
};
</script>

<input ... id='number_text' ... onkeyup="handleMaxInput()" ... >

Noterai un leggero ritardo in Chrome, ma chiamare questo in Firefox non risolverà il problema.

Possiamo essenzialmente forzare questo stesso comportamento in Firefox. Dopo aver giocato un po ', ho pensato che Chrome stesse rinfrescando / ricalcolando la spaziatura delle lettere su una sfocatura. La mia sessione di gioco ha mostrato che potresti forzare Firefox a ricalcolare questo valore a livello di codice:

  1. Cambia lo stile incorporato dell'attributo di spaziatura tra lettere in un valore diverso (poiché non possiamo modificare una classe CSS di number_text a livello di codice senza troppi sforzi, come riscrivere l'intero tag di stile nella sezione di stile di un documento).
  2. Rimuovere la classe number_text dall'input.
    • 1 e 2 sono intercambiabili, è necessario che Firefox esegua il fallback solo allo stile inline impostato, senza che gli attributi della classe vengano salvati "in memoria".
  3. Rimuovi lo stile inline e riapplica la classe CSS number_text. Ciò costringerà il browser a ricalcolare la separazione delle lettere nel momento in cui ne abbiamo bisogno.

Nel codice, sembrerebbe la seguente funzione JavaScript:

handleMaxInput = function(){
        var x = document.getElementById('number_text');
        let value = x.value
        if (value.length >= 6){ // if the input is 6 or more characters
              x.classList.remove('number_text') // remove the class
              x.style.letterSpacing = '0px' // reset the spacing
              setTimeout(function() { // set time to let browser refresh updates
                  x.classList.add('number_text') // Re-add class after browser refresh
                  setTimeout(function() { // Remove inline-style after more reculculations
                      x.style.removeProperty('letter-spacing') // Remove inline style to let class styles apply
                      x.blur // optional, will force input field to lose focus. Else comment out to avoid that.
              }, (1)); // waits 1 millisecond
          }, (1)); // waits 1 millisecond
        }
    }

Avrà lo stesso sfarfallio in Firefox come con Chrome, e tutto andrà bene.

Nota : le funzioni di timeout consentono di aggiornare il browser e di aggiornare effettivamente ciò di cui abbiamo bisogno.

Nota : è possibile scegliere di chiamare .blur () nella funzione per fare in modo che la casella di testo perda lo stato attivo, oppure ometterlo e rimarranno nel campo di input senza l'errore con le cifre.

Spero che questo aiuti la tua comprensione concettuale, oltre a risolvere il problema. Alcune altre persone hanno dato buone soluzioni che evitano tutto lo sfarfallio e funzionano sia in Firefox che in Chrome!


0

Sembra un problema di interfaccia utente comune che ho riscontrato prima.

Scommetto che fallisce anche su alcune piattaforme (questa è la natura di questo particolare bug.)

Su alcune piattaforme, ma non su tutte, viene utilizzato un carattere di spaziatura per indicare il punto di inserimento.

Su alcune piattaforme, ma non su tutte, questo personaggio non ha spaziatura, ma si sovrappone al prossimo, non all'ultimo, personaggio. Quindi, se non vi è alcun personaggio successivo, verrà riempito con lo spazio fino a quando non viene immesso.

In entrambi questi casi il display agirà in questo modo.

Questo è un caso in cui la soluzione migliore è la soluzione più semplice, adatta a questa stranezza di sistema comune, non la soluzione che la costringe a comportarsi come si desidera, come suggerito da alcune persone. Questo ha meno probabilità di introdurre bug e ha maggiori probabilità di funzionare su tutte le piattaforme.

La soluzione è dare un po 'di spazio libero alla fine della voce per visualizzare questo.

Aumenta la " larghezza " a 230 o 240 e dovresti essere bravo.

Inoltre, potresti persino meglio ospitare sistemi non standard, in particolare sistemi di accessibilità con caratteri o attributi di dimensione alternativi, semplicemente rilevando la larghezza inserendo spazi a larghezza intera nell'area, aggiungendo uno spazio di un quarto di larghezza alla fine, misurandoli, quindi eliminando o semplicemente truccandolo per sovrascrivere gli spazi a larghezza intera mentre l'utente digita (o altrimenti inserisce i dati, non presumere che sia una tastiera o addirittura qualcosa che inserisce un carattere alla volta).


0

$(document).on('keyup','#numberinput',function(){
    		var aa = $(this).val();

    		var aa = aa.substring(1);

    		if(aa.length > 5)
    		{
    			$('#numberinput').val(aa);
    		}
    	});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" name="" id="numberinput">

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.