Estou fazendo um aplicativo phonegap. Quando estou tentando o type="date"
campo de entrada conforme mostrado abaixo, ele mostra o seletor de data no iPhone como eu esperava, mas não mostra o marcador de posição que dei. Encontrei o mesmo problema aqui no SO, mas nenhuma solução em lugar nenhum.
<input placeholder="Date" class="textbox-n" type="date" id="date">
html
cordova
datepicker
placeholder
VP Mumthezir
fonte
fonte
Respostas:
Pode não ser apropriado ... mas me ajudou.
fonte
Se você usar o método mvp, mas adicionar o evento onblur para alterá-lo de volta para um campo de texto, para que o texto do espaço reservado apareça novamente quando o campo de entrada perder o foco. Isso apenas torna o hack um pouco mais agradável.
Espero que isto ajude.
fonte
Acabei usando o seguinte.
Com relação ao (s) comentário (s) do Firefox: Geralmente, o Firefox não mostra nenhum marcador de posição de texto para a data do tipo de entrada. Mas como esta é uma questão Cordova / PhoneGap, isso não deve ser motivo de preocupação (a menos que você queira desenvolver para o FirefoxOS).
fonte
<input type="date" placeholder="MY PLACEHOLDER" onchange="this.classList.toggle('has-value',this.value);">
input[type="date"]:not(:focus):not(.has-value):before
para mostrar o formato enquanto a entrada está focada (para pessoas que digitam a data em vez de selecionar)Eu usei isso no meu css:
e colocar algo assim no javascript:
funciona para mim para dispositivos móveis (Ios8 e Android). Mas eu usei jquery inputmask para desktop com tipo de texto de entrada. Esta solução é uma boa maneira se o seu código rodar no ie8.
fonte
color: #aaa
para uma aparência semelhante a um espaço reservado no iOS.color: lightgray
é muito leve.$("#myel").on( "input" , function(){ $(this).toggleClass( "full" , $(this).val().length > 0 ); });
Até hoje (2016), usei com sucesso esses 2 snippets (além disso, eles funcionam muito bem com o Bootstrap4).
Dados de entrada à esquerda, espaço reservado à esquerda
O marcador desaparece ao clicar
fonte
De acordo com o padrão HTML :
fonte
Funciona para mim:
fonte
:after
pseudo elemento desaparecer quando uma data for selecionada. Portanto, não há necessidade de remover o marcador de posiçãoonfocus="(this.placeholder='')"
para remover o marcador assim que a data for selecionada.Eu usei este com jQuery: http://jsfiddle.net/daviderussoabram/65w1qhLz/
fonte
Com base nas respostas de deadproxor e Alessio, eu tentaria usar apenas CSS:
E se você precisar tornar o placeholder invisível após escrever algo na entrada, podemos tentar usar os seletores: valid e: invalid, se sua entrada for obrigatória.
EDITAR
Aqui está o código, se você estiver usando obrigatório em sua entrada:
fonte
Encontrou uma maneira melhor de resolver seu problema. Eu acho que isso vai te ajudar. quando focalizado, a caixa mudará o tipo em texto para mostrar o espaço reservado. quando focado em, seu tipo muda para data para que a visualização do calendário seja mostrada.
fonte
Eu peguei a ideia do jbarlow, mas adicionei um if na função onblur para que os campos só mudem de tipo se o valor estiver vazio
fonte
Resolvendo o problema na resposta correta atual "clicar no campo mostra o teclado na tela em vez do selecionador de data":
O problema é causado pelo comportamento do navegador de acordo com o tipo de entrada ao clicar (= texto). Portanto, é necessário parar de focar no elemento de entrada (desfoque) e, em seguida, reiniciar o foco programaticamente no elemento de entrada que foi definido como type = date por JS na primeira etapa. O teclado é exibido no modo de número de telefone.
fonte
tente minha solução. Eu uso o atributo 'obrigatório' para saber se a entrada está preenchida e, caso não seja, mostro o texto do atributo 'espaço reservado'
fonte
Levei um tempo para descobrir isso, deixe como
type="text"
e adicioneonfocus="(this.type='date')"
, como mostrado acima.Eu até gosto da ideia onBlur mencionada acima
<input placeholder="Date" class="textbox-n" type="text" onfocus="(this.type='date')" onblur="(this.type='text')" id="date">
Espero que isso ajude alguém que não entendeu bem o que está acontecendo acima
fonte
Para resumir o problema das entradas de data:
A solução que encontrei para atender a esses requisitos é usar o truque usual para estilizar os elementos nativos do formulário: garantir que o elemento seja exibido, mas não visível, e exibir seu estilo esperado por meio de seu rótulo associado . Normalmente, o rótulo é exibido como entrada (incluindo um espaço reservado), mas sobre ele.
Portanto, um HTML como:
Pode ser denominado como:
Qualquer evento (clique, foco) em um rótulo associado será refletido no próprio campo e, portanto, acionará a IU de entrada de data.
Se você quiser testar essa solução ao vivo, pode executar esta versão Angular em seu tablet ou celular.
fonte
ASSIM, o que decidi fazer finalmente está aqui e está funcionando bem em todos os navegadores móveis, incluindo iPhones e Androids.
Encontro
fonte
Estou trabalhando com estrutura iônica e a solução fornecida por @Mumthezir é quase perfeita. No caso de alguém ter o mesmo problema que eu (após a mudança, a entrada ainda está focada e ao rolar, o valor simplesmente desaparece) Então eu adicionei onchange para fazer input.blur ()
fonte
Você pode
como isso...
fonte
Encontrou uma maneira melhor de lidar com a compreensão básica do usuário com o mouseover e abrindo o selecionador de data com um clique:
<input type="text" onfocus="(this.type='date')" onmouseover="(this.type = 'date')" onblur="(this.value ? this.type = 'date' : this.type = 'text')" id="date_start" placeholder="Date">
Além disso, oculte a seta do webkit e torne-a 100% ampla para cobrir o clique:
fonte
Do ponto de vista angular, consegui colocar um espaço reservado no elemento data do tipo de entrada.
Em primeiro lugar, defini o seguinte css:
A razão pela qual isso é necessário é que se o conteúdo css3 tem uma cor diferente do placeholder normal, então eu tive que usar um comum.
Em seguida, no modelo usado um atributo viewchild birthDate, para poder acessar essa entrada do componente. E definiu uma expressão angular no atributo placeholder, que decidirá se mostraremos o placeholder ou não. Esta é a principal desvantagem da solução, é que você tem que gerenciar a visibilidade do espaço reservado.
fonte
Código revisado de mumthezir
fonte
Estou surpreso que haja apenas uma resposta com uma abordagem semelhante à que usei.
Eu me inspirei no comentário de @Dtipson sobre a resposta de @Mumthezir VP.
Eu uso duas entradas para isso, uma é uma entrada falsa com
type="text"
a qual defino o espaço reservado, a outra é o campo real comtype="date"
.No
mouseenter
evento em seu contêiner, oculto a entrada falsa e mostro a real, e faço o contrário nomouseleave
evento. Obviamente, deixo a entrada real visível se ela tiver um valor definido.Eu escrevi o código para usar Javascript puro, mas se você usar jQuery (eu uso) é muito fácil "convertê-lo".
Testei isso também em um telefone Android e funciona, quando o usuário toca no campo aparece o selecionador de data. A única coisa é que, se a entrada real não tinha valor e o usuário fecha o selecionador de data sem escolher uma data, a entrada permanecerá visível até que toque fora dela. Não há evento para ouvir para saber quando o selecionador de data fecha, então não sei como resolver isso.
Não tenho um dispositivo iOS para testar.
fonte
Expandindo a solução de @mvp com javascript discreto em mente, esta é a abordagem:
HTML:
Javascript:
fonte
Acho que tudo que você precisa fazer é alterar o modelo para dizer que o campo de data pode ser anulado e, em seguida, colocar [Obrigatório] nele se for necessário. Se você fizer isso, o texto do espaço reservado aparecerá.
fonte
Ei, então encontrei o mesmo problema ontem à noite e descobri que uma combinação de todas as suas respostas e um pouco de magia brilhante está fazendo um bom trabalho:
O HTML:
O CSS:
O jQuery:
Explicação: Então, o que está acontecendo aqui, em primeiro lugar no HTML , é bastante simples fazer uma entrada de data HMTL5 básica e definir um espaço reservado. Próxima parada: CSS , estamos definindo um: before-pseudo-elemento para falsificar nosso placeholder, ele apenas pega o atributo do placeholder da própria entrada. Eu disponibilizei apenas a partir de uma largura de janela de visualização de 1024 px - por que contarei mais tarde. E agora o jQuery , depois de refatorar algumas vezes eu vim com este trecho de código que irá verificar em cada mudança se existe um valor definido ou não, se não for, ele (re) adicionará a classe, vice-versa .
CONHEÇA OS PROBLEMAS:
espero que ajude! cheerio!
fonte
Se você está preocupado apenas com o celular:
fonte
HTML:
JavaScript:
fonte
Aqui está outro possível hack sem usar js e ainda usando css
content
. Observe que, como:after
não é suportado em alguns navegadores para entradas, precisamos selecionar a entrada de outra maneira, o mesmo paracontent attr('')
fonte
Isso funciona para mim usando isso como elemento de entrada:
Este CSS mostra um espaço reservado permanente. O valor selecionado é mostrado após o espaço reservado.
Eu uso essa solução para um formulário Wordpress com o plugin contact-form-7.
fonte
Nenhuma das soluções estava funcionando corretamente para mim no Chrome no iOS 12 e a maioria delas não é adaptada para lidar com possíveis entradas de várias datas em uma página. Eu fiz o seguinte, que basicamente cria um rótulo falso sobre a entrada de data e o remove imediatamente. Também estou removendo o rótulo falso se a largura da janela de visualização estiver além de 992 px.
JS:
CSS:
fonte