Lorsque vous utilisez la balise input
en tant que type="tel"
, le clavier des périphériques tactiles correspond au type de zone de saisie. Cependant, je souhaite garder la valeur dans la balise input
cachée (comme avec le type password
). Le comportement normal consisterait à masquer chaque caractère pendant la frappe.
<input type="tel">
input [type="tel"] {
-webkit-text-security: disc;
}
Cette solution fonctionne dans la plupart des navigateurs, mais pas dans IE.
<input type="password" pattern="[0-9]*" inputmode="numeric">
Cette solution ne fonctionne pas comme prévu.
Y a-t-il un moyen d'accomplir ce que j'essaie de faire?
Je sais qu’il existe déjà une solution agréable, efficace et acceptée de la part de jdgregson, mais j’ai vraiment aimé l’idée de rybo111 d’une solution basée sur les polices personnalisées et je voulais l’essayer.
L'idée est de créer une police ne contenant que des cercles afin que, lorsque la famille de polices est appliquée à l'élément en entrée, aucun caractère ne soit apparemment affiché.
Donc, au cas où quiconque serait toujours intéressé par une solution non-JS avec un support de navigateur décent et sans les problèmes connus liés à la réponse de jdgregson, j'ai créé une police simple pour cela.
GitHub repo : https://github.com/noppa/text-security
Démo de JSFiddle : https://jsfiddle.net/449Lamue/6/
La police peut être utilisée en incluant le dist/text-security.css à partir du référentiel cloné ou de RawGit ou quelque chose de similaire. Après avoir inclus le css, vous pouvez utiliser la police en définissant le font-family
de l'élément sur 'text-security-disc'
.
<link rel="stylesheet" type="text/css" href="https://cdn.rawgit.com/noppa/text-security/master/dist/text-security.css">
<style>
input [type="tel"] {
font-family: "text-security-disc";
-webkit-text-security: disc;
}
</style>
Dans l’esprit de "remplir" la sécurité -webkit-text-security, j’ai également ajouté les options "circle" et "square" à utiliser comme symbole de masquage.
J'ai testé cela avec Chrome v49, IE11, Microsoft Edge 25 et Chrome v50 sur Android 5.0, dans lesquels l'entrée de type "tel" ouvre le clavier numérique.
Vous pouvez y parvenir de plusieurs manières:
La solution la plus élégante consiste à utiliser le style CSS intégré -webkit-text-security: circle;
qui est destiné à cette chose. Malheureusement, ce n'est pas portable, et n'est pas supporté sur IE ou Edge. Vous pouvez trouver une solution de contournement pour obtenir de l’assistance sur d’autres navigateurs ici si vous choisissez d’utiliser cette approche.
Comme Fidel90 et d'autres l'ont fait remarquer, vous pouvez essayer de passer du type="tel"
au type="password"
après que l'utilisateur l'a sélectionné. J'ai fait un violon de cette idée ici . Cela fonctionne parfaitement sous iOS, mais sous Android, il ne parvient pas à lancer le premier tap puis se lance comme clavier par défaut lors du second tap.
Une autre idée suggérée par rybo111 dans les commentaires qui a été implémentée par noppa ci-dessous consiste à utiliser une police ne disposant que d'un caractère de mot de passe. C'est probablement la solution la plus portable et la moins piratée. Un inconvénient est que l’utilisateur ne peut pas voir le caractère qu’il vient de taper comme le fait le comportement habituel des champs de mot de passe mobile modernes. Un violon complet de ceci est affiché ici .
Mon idée (ci-dessous) est d’utiliser une seconde entrée pour stocker le nombre réel, puis le masquer au fur et à mesure que l’utilisateur le tape. Notez que cela filtrera tous les caractères du numéro final qui ne sont pas des numéros de téléphone, bien que vous puissiez modifier la variable pour accepter ce que vous voulez.
Testé et fonctionne sur:
var BACKSPACE_CHARS = [8, 46, 229];
function hideNumber(fakeInput, event) {
var hideChar = '*';
// add characters that you want to appear in the final number to this
// string -- leave the string empty to allow all characters
var phoneChars = '0123456789()-+';
var keyCode = event.keyCode || event.charCode;
var key = String.fromCharCode(keyCode)+'';
var realInput = document.getElementById("hidden-number");
var len = fakeInput.value.length;
fakeInput.value = '';
if(phoneChars.indexOf(key) > -1 || !phoneChars.length) {
realInput.value += key;
} else {
if(BACKSPACE_CHARS.indexOf(keyCode) < 0) {
--len;
}
}
for(var i=0; i<len; i++) { // no String.repeat() in IE :(
fakeInput.value += hideChar;
}
updateDisplay();
}
function backspace(event) {
var keyCode = event.keyCode || event.charCode;
var realInput = document.getElementById("hidden-number");
if(BACKSPACE_CHARS.indexOf(keyCode) > -1) { // backspace or delete
var len = realInput.value.length;
realInput.value = realInput.value.slice(0, len-1);
}
updateDisplay();
}
function updateDisplay() {
var realInput = document.getElementById("hidden-number");
var display = document.getElementById("display");
display.innerHTML = realInput.value || '';
}
<input type="tel" name="number" id="number-hider" onkeypress="hideNumber(this, event)" onkeydown="backspace(event)" onblur="hideNumber(this)">
<input type="hidden" name="realnumber" id="hidden-number">
<div id="display"></div>
Bugs connus:
J'ai créé un violon qui remplace la tel
initiale par une entrée password
dès que vous la focalisez (jQuery nécessaire):
var value = "",
isPWD = false;
$('#wrap')
.on("focus", "#input", function() {
if (!isPWD) {
var pass = $('<input id="input" type="password">');
$(this).replaceWith(pass);
isPWD = true;
pass.focus();
}
})
.on("change", "#input", function() {
value = $(this).val();
$("#span").text(" = " + value);
})
.on("blur", "#input", function() {
var tel = $('<input id="input" type="tel">');
$(this).replaceWith(tel);
isPWD = false;
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="wrap">
<input id="input" type="tel"/>
<span id="span"></span>
</div>
Je n'ai pas testé cela sur un appareil mobile jusqu'à présent, donc je ne suis pas sûr de pouvoir utiliser le pavé numérique pour l'utilisateur dans tous les cas.
EDIT: Au moins mon portable IE ne montrait pas de pavé numérique, mais uniquement le champ de texte standard.
En utilisant noppa's answer et sa police GitHub et jdgregson's answer , voici une solution CSS clé en main ( fiddle ):
@font-face {
font-family: "password-mask";
src: url(data:font/woff;charset:utf-8;base64,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) format("woff");
}
.numeric-password {
font-family: password-mask;
}
.numeric-password::placeholder {
font-family: initial;
}
<input type="tel" class="numeric-password" placeholder="test" />
Pour prendre en charge les appareils iOS et Android plus anciens, il vous suffirait d'ajouter une autre définition de police-face URI de données avec le fichier ttf pour la police de masque de mot de passe. Idem pour IE avec le fichier de police eot, mais la plupart des navigateurs modernes prennent en charge woff et devraient fonctionner avec ce CSS.