36 votes

iOS5 affiche le clavier numérique par défaut sans utiliser type="number" ou type="tel".

Avec la sortie d'iOS5, Apple a ajouté sa propre validation aux champs de formulaire input type="number". Cela pose quelques problèmes ; voir la question ci-dessous qui résume la situation :

La nouvelle validation d'Input type='number' supprime les zéros non significatifs et formate le nombre dans Safari pour iPhone iOS5 et dans la dernière version de Safari pour Mac.

Bien que l'entrée type="tel" fonctionne pour faire apparaître un clavier numérique sur l'iphone, c'est l'entrée type="tel" qui est utilisée. clavier du téléphone qui n'a pas de point décimal.

Existe-t-il un moyen de définir le clavier numérique par défaut en utilisant html/js ? Il ne s'agit pas d'une application iphone. J'ai besoin au minimum de chiffres et d'un point décimal dans le clavier.

Mise à jour

Les champs de saisie de nombres dans Safari 5.1/iOS 5 n'acceptent que les chiffres et les points décimaux. La valeur par défaut de l'une de mes entrées est $500,000 . Le résultat est que Safari affiche un champ de saisie vide car $ , % sont des caractères non valides.

De plus, quand j'exécute ma propre validation onblur Safari efface le champ de saisie parce que j'ajoute un $ à la valeur.

Ainsi, l'implémentation de l'entrée type="nombre" dans Safari 5.1/iOS5 l'a rendu inutilisable.

jsfiddle

Essayez-le ici - http://jsfiddle.net/mjcookson/4ePeE/ La valeur par défaut de 500 000 $ n'apparaît pas dans Safari 5.1, mais si vous supprimez les symboles $ et , elle apparaît. C'est frustrant.

16voto

Tadeck Points 37046

Styliser le champ pour qu'il contienne des symboles

Lorsqu'il s'agit d'inclure les symboles dans cette number vous pouvez utiliser une solution de contournement comme celle-ci :

HTML :

<span id="number-container">
    <input type="number" name="number" id="number-field" value="500" />
    <span id="number-container-symbol">$</span>
</span>

CSS :

#number-container {
    position: relative;
}
#number-container-symbol {
    left: 5pt;
    position: absolute;
    top: 0px;
}
#number-field {
    background-color: transparent;
    padding-left: 10pt;
}

Considérez-le comme une preuve de concept. Voir ce jsfiddle pour un exemple concret. Cela ressemble à cela dans Chrome :

enter image description here

Définir une granularité plus petite

Sur la base de la documentation sur la saisie des numéros (Editor's Draft) à définir la granularité vous devez ajouter step="<some-floating-point-number>" de l'attribut <input> étiquette :

<input type="number" name="number" value="500.01" step="0.01" />

et il fonctionnera dans de nombreux navigateurs modernes. Voir ce jsfiddle pour les tests.

Conclusion

Vous devriez être en mesure de le styliser pour qu'il contienne les symboles dont vous avez besoin. Il existe également une fonctionnalité qui, selon la documentation, permet de prendre en charge les nombres à virgule flottante.

Solution alternative - champ vide devant quelque chose d'autre

Vous pouvez également faire croire à quelqu'un qu'il voit le contenu du champ de saisie. mais lui montrer quelque chose d'autre derrière le champ (c'est une extension de ma solution originale). Ensuite, si quelqu'un touche le champ, vous pouvez propager la valeur appropriée, etc., puis revenir à l'état précédent en cas de flou. Voir ce code ( exemple en direct sur jsfiddle - la couleur bleue signifie que vous regardez quelque chose qui n'est pas dans le champ) :

// store original value from INPUT tag in jQuery's .data()
var input_field = jQuery('#number-field');
var display_span = jQuery('#number-container-value');
var base_val = parseFloat(input_field.val());
input_field.data('storedVal', base_val);
input_field.val('');
display_span.html(base_val);

// react to field gaining and losing focus
jQuery('#number-field').on('focus', function(event){
    var el = jQuery(this);
    var display = jQuery('#number-container-value');
    if (typeof el.data('storedVal') != 'undefined'){
        el.val(el.data('storedVal'));
    };
    display.html('');
}).on('blur', function(event){
    var el = jQuery(this);
    var display = jQuery('#number-container-value');
    var new_val = parseFloat(el.val());
    el.data('storedVal', new_val);
    display.html(new_val);
    el.val('');
});

(le code complet avec le style est sur le jsfiddle mentionné). Le code a besoin d'être raccourci et nettoyé, mais il s'agit d'une preuve de concept . Essayez-le et partagez vos conclusions, s'il vous plaît.

7voto

Dad Points 3898

Pourquoi ne pas mettre le $ en dehors du champ de saisie (comme une étiquette). Ou le signe pour cent à droite du champ de saisie ? Il semble que cela résoudrait votre problème et que vous pourriez utiliser input type="number" et que cela fonctionnerait.

5voto

Ahmed Nuaman Points 2816

Vous êtes coincé entre le marteau et l'enclume. Jusqu'à ce qu'il y ait une place dans la spécification HTML pour type="currency" (et cela n'arrivera probablement jamais en raison des différentes façons dont les pays écrivent la monnaie), vous allez devoir utiliser la magie des JS pour contourner le problème.

Bien sûr, le numéro de téléphone n'est pas la meilleure idée, mais en utilisant un peu d'astuces de JS, j'ai trouvé cette solution :

var i   = document.getElementById( 'input' );

i.onblur    = function()
{
    i.type  = 'text';

    i.value = number_format( i.value );
}

i.onfocus   = function()
{
    var v   = Number( i.value.replace( /\D/, '' ) );

    i.type  = 'number';

    i.value = v > 0 ? v : '';
}

Je permute simplement le type de l'entrée en fonction du focus/blur, cela signifie qu'une fois que l'utilisateur a quitté le champ de texte, nous pouvons formater son ass. Lorsque l'utilisateur revient, nous prenons la valeur, s'il y en a une qui est > 0 et nous la remettons en place comme un nombre. Voici le test fonctionnel, j'espère que cela vous aidera : http://jsfiddle.net/ahmednuaman/uzYQA/

3voto

robocat Points 1567

Ce qui suit fait apparaître le clavier numérique pour iPad avec iOS5, permet de tout à taper, et permet tout valeur à définir :

<input type="text" pattern="\d*">

Cependant, il est laid, fragile (il se cassera probablement à l'avenir ...), et ne fonctionne pas sur l'iPhone (l'iPhone affiche le clavier numérique qui ne permet que 0 à 9). La solution ne semble fonctionner qu'en utilisant le motif \d* ou son équivalent [0-9]* .

Il est peut-être préférable d'utiliser type="tel" qui semble agir de la même manière.

3voto

marissajmc Points 1509

Solution de travail : Testé sur iPhone 5, Android 2.3, 4

La solution de Tadeck (vainqueur de la prime) qui consiste à utiliser une <span> pour contenir les symboles du champ de saisie et placer un message formaté <span> en plus de l'entrée de la devise est essentiellement ce que j'ai fini par faire.

Mon code final est cependant différent et plus court, c'est pourquoi je le poste ici. Cette solution résout le problème de validation de l'iOS5 pour les symboles $ , % dans les champs de saisie, etc. input type="number" peut être utilisé par défaut.

Champ de symboles, par exemple "xx %" "xx années".

<input name="interest-rate" value="6.4" maxlength="4" min="1" max="20" />
<span class="symbol">%</span>
  • Il suffit d'utiliser un champ de saisie de chiffres et un espace en dehors de la saisie pour afficher le symbole.

Champ monétaire, par exemple "$xxx,xxx".

<span id="formatted-currency">$500,000</span>
<input id="currency-field" type="number" name="loan-amount" value="500000" maxlength="8" min="15000" max="10000000" />
  • Positionnez le span au dessus de l'entrée de la devise et définissez l'entrée sur display:none
  • Lorsqu'un utilisateur clique ou tape sur la travée, il faut masquer la travée et afficher l'icône de l'utilisateur. entrée. Si vous positionnez parfaitement le span, la transition est transparente.
  • Le type de saisie numérique se charge de la validation.
  • Lors de l'effacement et de l'envoi de l'entrée, définissez le span html comme étant la valeur de l'entrée. de l'entrée. Formatez le span. Cachez l'entrée et affichez le span avec la valeur valeur formatée.

    $('#formatted-currency').click(function(){ $(this).hide(); $('#currency-field').show().focus(); }); $('#currency-field').blur(function(){ $('#formatted-currency').html(this.value); $('#formatted-currency').formatCurrency({ roundToDecimalPlace : -2 }); $(this).hide(); $('#formatted-currency').show(); }); // on submit $('#formatted-currency').html($('#currency-field').val()); $('#formatted-currency').formatCurrency({ roundToDecimalPlace : -2 }); $('#currency-field').hide(); $('#formatted-currency').show();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X