Por moeda, sugiro:
<div><label>Amount $
<input type="number" placeholder="0.00" required name="price" min="0" value="0" step="0.01" title="Currency" pattern="^\d+(?:\.\d{1,2})?$" onblur="
this.parentNode.parentNode.style.backgroundColor=/^\d+(?:\.\d{1,2})?$/.test(this.value)?'inherit':'red'
"></label></div>
Consulte http://jsfiddle.net/vx3axsk5/1/
As propriedades "etapa", "min" e "padrão" do HTML5 serão validadas quando o formulário for enviado, não ativadas. Você não precisa do step
se tiver um pattern
e não precisa do pattern
se tiver um step
. Então você pode voltar ao step="any"
meu código, pois o padrão o validará de qualquer maneira.
Se você deseja validar o onblur, acredito que fornecer uma dica visual ao usuário também é útil, como colorir o fundo em vermelho. Se o navegador do usuário não suportar, type="number"
ele fará o fallback para type="text"
. Se o navegador do usuário não suportar a validação de padrão HTML5, meu snippet JavaScript não impede o envio do formulário, mas fornece uma dica visual. Portanto, para pessoas com pouco suporte ao HTML5 e para pessoas que tentam invadir o banco de dados com o JavaScript desativado ou forjar solicitações HTTP, é necessário validar o servidor novamente de qualquer maneira. O ponto com a validação no front-end é para uma melhor experiência do usuário. Desde que a maioria dos usuários tenha uma boa experiência, não há problema em confiar nos recursos HTML5, desde que o código ainda funcione e você possa validar no back-end.