web-dev-qa-db-fra.com

Masquage de texte en entrée Javascript sans plugin

Je souhaite masquer le texte dans une zone de saisie sans modifier la valeur réelle. Je ne peux utiliser aucun plugin.

Je fais actuellement cela - mais comme vous pouvez le voir, le problème est que la valeur réelle est modifiée lors de la soumission. Comment puis-je simplement changer la valeur d'affichage?

$("input[name='number']").focusout(function(){
    var number = this.value.replace(/(\d{2})(\d{3})(\d{2})/,"$1-$2-$3");
    this.value = number;
}
8
user1392897

Vous avez besoin de deux entrées

Deux entrées devraient faire le travail. Une entrée contiendra le texte masqué et l'autre sera une entrée cachée qui contient les données réelles.

<input type="text" name="masknumber">
<input type="text" name="number" style="display:none;">

La façon dont j'ai abordé le masquage est de créer une fonction pour masquer et démasquer le contenu afin que tout reste uniforme.

$("input[name='masknumber']").on("keyup change", function(){
        $("input[name='number']").val(destroyMask(this.value));
    this.value = createMask($("input[name='number']").val());
})

function createMask(string){
    return string.replace(/(\d{2})(\d{3})(\d{2})/,"$1-$2-$3");
}

function destroyMask(string){
    return string.replace(/\D/g,'').substring(0,8);
}

JSFiddle de travail

10

ou aussi

<input type="text" onkeypress="handleMask(event, 'data: 99/99/9999 99:99 999 ok')" placeholder="data:  ok" size=40>

avec

function handleMask(event, mask) {
    with (event) {
        stopPropagation()
        preventDefault()
        if (!charCode) return
        var c = String.fromCharCode(charCode)
        if (c.match(/\D/)) return
        with (target) {
            var val = value.substring(0, selectionStart) + c + value.substr(selectionEnd)
            var pos = selectionStart + 1
        }
    }
    var nan = count(val, /\D/, pos) // nan va calcolato prima di eliminare i separatori
    val = val.replace(/\D/g,'')

    var mask = mask.match(/^(\D*)(.+9)(\D*)$/)
    if (!mask) return // meglio exception?
    if (val.length > count(mask[2], /9/)) return

    for (var txt='', im=0, iv=0; im<mask[2].length && iv<val.length; im+=1) {
        var c = mask[2].charAt(im)
        txt += c.match(/\D/) ? c : val.charAt(iv++)
    }

    with (event.target) {
        value = mask[1] + txt + mask[3]
        selectionStart = selectionEnd = pos + (pos==1 ? mask[1].length : count(value, /\D/, pos) - nan)
    }

    function count(str, c, e) {
        e = e || str.length
        for (var n=0, i=0; i<e; i+=1) if (str.charAt(i).match(c)) n+=1
        return n
    }
}
0
Giacomo