Ответ 1
Это может быть неуместно... но это помогло мне наконец.
<input placeholder="Date" class="textbox-n" type="text" onfocus="(this.type='date')" id="date">
Я делаю приложение phonegap, когда я пытаюсь ввести поле ввода type="date"
, как показано ниже, оно показывает выбор даты в iPhone, как я ожидал, но он не показывает заполнителя, который я дал. Я нашел такую же проблему здесь, в SO, но нигде в решении, надеюсь, кто-то может мне помочь. Спасибо.
<input placeholder="Date" class="textbox-n" type="date" id="date">
Это может быть неуместно... но это помогло мне наконец.
<input placeholder="Date" class="textbox-n" type="text" onfocus="(this.type='date')" id="date">
Если вы используете метод mvp, но добавляете событие onblur, чтобы изменить его обратно в текстовое поле, чтобы текст заполнителя снова появлялся, когда поле ввода теряет фокус. Это просто делает взлома немного приятнее.
<input placeholder="Date" class="textbox-n" type="text" onfocus="(this.type='date')" onblur="(this.type='text')" id="date">
Надеюсь, что это поможет.
Я закончил тем, что использовал следующее.
Относительно комментариев Firefox: Как правило, Firefox не будет отображать текстовый заполнитель для даты ввода типа. Но так как это вопрос Cordova/PhoneGap, это не должно вызывать беспокойства (если только вы не хотите разрабатывать против FirefoxOS).
input[type="date"]:not(.has-value):before{
color: lightgray;
content: attr(placeholder);
}
<input type="date" placeholder="MY PLACEHOLDER" onchange="this.className=(this.value!=''?'has-value':'')">
Я использовал это в моем css:
input[type="date"]:before{
color:lightgray;
content:attr(placeholder);
}
input[type="date"].full:before {
color:black;
content:""!important;
}
и помещаем подобный в javascript:
$("#myel").on("input",function(){
if($(this).val().length>0){
$(this).addClass("full");
}
else{
$(this).removeClass("full");
}
});
он работает для меня для мобильных устройств (Ios8 и Android). Но я использовал jquery inputmask для рабочего стола с типом ввода текста. Это решение хорошо, если ваш код работает на ie8.
На сегодняшний день (2016), я успешно использовал эти 2 фрагмента (плюс они отлично работают с Bootstrap4).
input[type=date] {
text-align: right;
}
input[type="date"]:before {
color: lightgrey;
content: attr(placeholder) !important;
margin-right: 0.5em;
}
input[type="date"]:before {
color: lightgrey;
content: attr(placeholder) !important;
margin-right: 0.5em;
}
input[type="date"]:focus:before {
content: '' !important;
}
Согласно стандарт HTML:
Следующие атрибуты контента не должны указываться и не применяются к элементу: accept, alt, checked, dirname, formaction, formenctype, formmethod, formnovalidate, formtarget, height, inputmode, maxlength, minlength, multiple, pattern, placeholder, размер, src и width.
Я использовал этот whit jQuery: http://jsfiddle.net/daviderussoabram/65w1qhLz/
$('input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="month"], input[type="time"], input[type="week"]').each(function() {
var el = this, type = $(el).attr('type');
if ($(el).val() == '') $(el).attr('type', 'text');
$(el).focus(function() {
$(el).attr('type', type);
el.click();
});
$(el).blur(function() {
if ($(el).val() == '') $(el).attr('type', 'text');
});
});
Это работает для меня:
input[type='date']:after {
content: attr(placeholder)
}
Основываясь на ответах deadproxor и Alessio, я бы попробовал использовать только CSS:
input[type="date"]::before{
color: #999;
content: attr(placeholder) ": ";
}
input[type="date"]:focus::before {
content: "" !important;
}
И если вам нужно сделать невидимым местозаполнитель после записи чего-либо во входе, мы могли бы попытаться использовать: valid и: invalid selectors, если ваш вход является обязательным.
ИЗМЕНИТЬ
Здесь код, если вы используете требуемый ввод:
input[type="date"]::before {
color: #999999;
content: attr(placeholder);
}
input[type="date"] {
color: #ffffff;
}
input[type="date"]:focus,
input[type="date"]:valid {
color: #666666;
}
input[type="date"]:focus::before,
input[type="date"]:valid::before {
content: "" !important;
}
<input type="date" placeholder="Date" required>
Нашел лучший способ решить вашу проблему. Я думаю, что это поможет вам. когда выделено, поле изменит тип на текст, чтобы отобразить ваш заполнитель. когда он сфокусирован, его тип меняется на дату, поэтому будет отображаться представление календаря.
<input placeholder="Date" class="textbox-n" type="text" onfocusin="(this.type='date')" onfocusout="(this.type='text')" id="date">
Адаптация проблемы в текущем правильном ответе: "Щелчок по полю показывает экранную клавиатуру вместо параметра datepicker":
Проблема вызвана тем, что браузер работает в соответствии с типом ввода при нажатии (= текст). Поэтому необходимо прекратить фокусировку на входном элементе (размытие), а затем программным образом возобновить фокус на входном элементе, который был определен как тип = дата на JS на первом этапе. Отображение клавиатуры в режиме phonenumber.
<input placeholder="Date" type="text" onfocus="this.type='date';
this.setAttribute('onfocus','');this.blur();this.focus();">
Придумал это, оставьте его как type="text"
и добавьте onfocus="(this.type='date')"
, как показано выше.
Мне даже нравится идея onBlur, упомянутая выше
<input placeholder="Date" class="textbox-n" type="text" onfocus="(this.type='date')" onblur="(this.type='text')" id="date">
Надеюсь, это поможет любому, кто не совсем понял, что происходит выше
Чтобы суммировать проблему ввода дат:
Решение, которое я нашел для удовлетворения этих требований, состоит в том, чтобы использовать обычный трюк для стилей элементов собственной формы: убедитесь, что элемент отображается, но не отображается, а отображает его ожидаемый стиль с помощью связанной метки. Обычно ярлык будет отображаться как вход (включая местозаполнитель), но над ним.
Итак, HTML вроде:
<div class="date-input>
<input id="myInput" type="date">
<label for="myInput">
<span class="place-holder">Enter a date</span>
</label>
</div>
Может быть написано как:
.date-input {
display: inline-block;
position: relative;
}
/* Fields overriding */
input[type=date] + label {
position: absolute; /* Same origin as the input, to display over it */
background: white; /* Opaque background to hide the input behind */
left: 0; /* Start at same x coordinate */
}
/* Common input styling */
input[type=date], label {
/* Must share same size to display properly (focus, etc.) */
width: 15em;
height: 1em;
font-size: 1em;
}
Любое событие (щелчок, фокус) на такой связанной метке будет отражено в самом поле и поэтому вызывает входной интерфейс ввода даты.
Если вы хотите протестировать такое решение вживую, вы можете запустить эту Angular версию с вашего планшета или мобильного телефона.
Итак, что я решил сделать, наконец, здесь и его работа отлично работает на всех мобильных браузерах, включая iPhone и Androids.
$(document).ready(function(){
$('input[type="date"]').each(function(e) {
var $el = $(this),
$this_placeholder = $(this).closest('label').find('.custom-placeholder');
$el.on('change',function(){
if($el.val()){
$this_placeholder.text('');
}else {
$this_placeholder.text($el.attr('placeholder'));
}
});
});
});
label {
position: relative;
}
.custom-placeholder {
#font > .proxima-nova-light(26px,40px);
position: absolute;
top: 0;
left: 0;
z-index: 10;
color: #999;
}
<label>
<input type="date" placeholder="Date">
<span class="custom-placeholder">Date</span>
</label>
Im, работающий с ионной каркасом и раствором, предлагаемым компанией @Mumthezir, почти идеален. В случае, если у кого-то будет такая же проблема, как у меня (после изменения вход все еще сфокусирован, а при прокрутке значение просто исчезает). Поэтому я добавил onchange для ввода input.blur()
<input placeholder="Date" class="textbox-n" type="text" onfocus=" (this.type='date')" onchange="this.blur();" id="date">
Вы можете
как это...
$("#dateplaceholder").change(function(evt) {
var date = new Date($("#dateplaceholder").val());
$("#dateplaceholder").attr("type", "text");
$("#dateplaceholder").val(date.getDate() + "/" + (date.getMonth() + 1) + "/" + date.getFullYear());
});
$("#dateplaceholder").focus(function(evt) {
$("#dateplaceholder").attr("type", "date");
setTimeout('$("#dateplaceholder").click();', 500);
});
$("#dateplaceholder").attr("type", "text");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<input type="date" id="dateplaceholder" placeholder="Set the date" />
С точки зрения Angular мне удалось установить местозаполнитель в элементе даты типа ввода.
Прежде всего, я определил следующий css:
.placeholder {
color: $text-grey;
}
input[type='date']::before {
content: attr(placeholder);
}
input::-webkit-input-placeholder {
color: $text-grey;
}
Причина, по которой это необходимо, заключается в том, что если содержимое css3 имеет другой цвет, который является обычным заполнителем, поэтому мне пришлось использовать общий.
<input #birthDate
class="birthDate placeholder"
type="date"
formControlName="birthDate"
placeholder="{{getBirthDatePlaceholder() | translate}}"
[class.error]="!onboardingForm.controls.birthDate.valid && onboardingForm.controls.birthDate.dirty"
autocomplete="off"
>
Затем в шаблоне используется атрибут birthdate viewchild, чтобы иметь возможность получить доступ к этому входу от компонента. И определил выражение Angular в атрибуте placeholder, который будет решать, показывать ли мы местозаполнитель или нет. Это основной недостаток решения, заключается в том, что вам необходимо управлять видимостью заполнителя.
@ViewChild('birthDate') birthDate;
getBirthDatePlaceholder() {
if (!this.birthDate) {
return;
} else {
return this.birthDate.nativeElement.value === '' ?
'ONBOARDING_FORM_COMPONENT.HINT_BIRTH_DATE' :
'';
}
}
Найден лучший способ обработки базового понимания пользователя с помощью наведения мыши и открытия указателя даты при нажатии:
<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">
Также скройте стрелку webkit и сделайте ее 100% шириной, чтобы покрыть клик:
input[type="date"] {
position: relative;
}
input[type="date"]::-webkit-calendar-picker-indicator {
position: absolute;
height: 100%;
width: 100%;
opacity: 0;
left: 0;
right: 0;
top:0;
bottom: 0;
}
попробуй мое решение. Я использую атрибут 'required', чтобы узнать, заполнен ли ввод, и если нет, я показываю текст из атрибута 'placeholder'
//HTML
<input required placeholder="Date" class="textbox-n" type="date" id="date">
//CSS
input[type="date"]:not(:valid):before {
content: attr(placeholder);
// style it like it real placeholder
}
Я взял идею jbarlow, но я добавил if в функцию onblur, чтобы поля меняли свой тип, только если значение пустое
<input placeholder="Date" class="textbox-n" type="text" onfocus="(this.type='date')" onblur="(this.value == '' ? this.type='text' : this.type='date')" id="date">
Расширение на @mvp-решение с ненавязчивым javascript в уме, здесь подход:
HTML:
<input type="text" placeholder="Date" class="js-text-date-toggle">
JavaScript:
$('.js-text-date-toggle').on('focus', function() {
$(this).attr('type', 'date') }
).on('blur', function() {
$(this).attr('type'), 'text') }
)
Я думаю, что все, что вам нужно сделать, это изменить модель, чтобы сказать, что поле даты равно NULL, а затем поставить [Требуется] на нее, если это необходимо. Если вы это сделаете, появится текст заполнителя.
Эй, таким образом, я столкнулся с тем же вопросом прошлой ночью и вычислил комбинацию всего вашего ответа, и какая-то сверкающая магия делает хорошую работу:
HTML:
<input type="date" name="flb5" placeholder="Datum" class="datePickerPlaceHolder"/>
CSS:
@media(max-width: 1024px) {
input.datePickerPlaceHolder:before {
color: #A5A5A5; //here you have to match the placeholder color of other inputs
content: attr(placeholder) !important;
}
}
jQuery:
$(document).ready(function() {
$('input[type="date"]').change(function(){
if($(this).val().length < 1) {
$(this).addClass('datePickerPlaceHolder');
} else {
$(this).removeClass('datePickerPlaceHolder');
}
});
});
Объяснение: Итак, что здесь происходит, прежде всего в HTML, это довольно прямолинейно, просто делая базовый ввод даты HMTL5 и устанавливая местозаполнитель. Следующая остановка: CSS, мы устанавливаем: before-pseudo-element для подделки нашего заполнителя, он просто берет атрибут placeholder из самого входа. Я сделал это доступным только с ширины окна просмотра 1024px - почему я расскажу позже. И теперь jQuery, после рефакторинга пару раз я придумал этот бит кода, который будет проверять каждое изменение, если есть значение, установленное или нет, если оно не будет (повторно) добавьте класс, наоборот.
ЗНАТЬ ВОПРОСЫ:
надеюсь, что это поможет! здор`ово!
<input placeholder="Date" type="text" onMouseOver="(this.type='date')" onMouseOut="(this.type='text')" id="date" class="form-control">
Если вас интересует только мобильная связь:
input[type="date"]:invalid:before{
color: rgb(117, 117, 117);
content: attr(placeholder);
}
HTML:
<div>
<input class="ui-btn ui-btn-icon-right ui-corner-all ui-icon-calendar ui-shadow" id="inputDate" type="date"/>
<h3 id="placeholder-inputDate">Date Text</h3>
</div>
JavaScript:
$('#inputDate').ready(function () {
$('#placeholder-inputDate').attr('style'
, 'top: ' + ($('#placeholder-inputDate').parent().position().top + 10)
+ 'px; left: ' + ($('#placeholder-inputDate').parent().position().left + 0) + 'px; position: absolute;');
$('#inputDate').attr('style'
, 'width: ' + ($('#placeholder-inputDate').width() + 32) + 'px;');
});
Вот еще один возможный хак, не использующий js и все еще использующий content
css. Обратите внимание, что поскольку :after
не поддерживается в некоторых браузерах для входных данных, нам нужно выбрать входные данные другим способом, то же самое для content attr('')
input[type=date]:invalid+span:after {
content:"Birthday";
position:absolute;
left:0;
top:0;
}
input[type=date]:focus:invalid+span:after {
display:none;
}
input:not(:focus):invalid {
color:transparent;
}
label.wrapper {
position:relative;
}
<label class="wrapper">
<input
type="date"
required="required"
/>
<span></span>
</label>
Это работает для меня, используя это в качестве элемента ввода:
<input name="birthdate" class="" class="wpcf7-form-control wpcf7-date
wpcf7-validates-as-required wpcf7-validates-as-date birthdate" value=""
aria-required="true" aria-invalid="false" placeholder="birthdate *"
type="date">
Этот CSS показывает постоянный заполнитель. Выбранное значение отображается после заполнителя.
input[type="date"]:before {
content: attr(placeholder) !important;
margin-right: 0.5em;
display: block;
}
/* only for FF */
@-moz-document url-prefix() {
input[type="date"]:before {
content: attr(placeholder) !important;
margin-right: 0.5em;
display: block;
position: absolute;
left: 200px; /* please adopt */
}
}
Я использую это решение для формы Wordpress с плагином contact-form-7.
Ни одно из решений не работало правильно для меня на Chrome в iOS 12, и большинство из них не приспособлены для того, чтобы справиться с возможным вводом нескольких дат на странице. Я сделал следующее, что в основном создает фальшивый ярлык над вводом даты и удаляет его при нажатии. Я также удаляю фальшивую метку, если ширина области просмотра превышает 992px.
JS:
function addMobileDatePlaceholder() {
if (window.matchMedia("(min-width: 992px)").matches) {
$('input[type="date"]').next("span.date-label").remove();
return false;
}
$('input[type="date"]').after('<span class="date-label" />');
$('span.date-label').each(function() {
var $placeholderText = $(this).prev('input[type="date"]').attr('placeholder');
$(this).text($placeholderText);
});
$('input[type="date"]').on("click", function() {
$(this).next("span.date-label").remove();
});
}
CSS:
@media (max-width: 991px) {
input[type="date"] {
padding-left: calc(50% - 45px);
}
span.date-label {
pointer-events: none;
position: absolute;
top: 2px;
left: 50%;
transform: translateX(-50%);
text-align: center;
height: 27px;
width: 70%;
padding-top: 5px;
}
}
Расширение версии Mumthezir, которая работает лучше на iOS, на основе комментария Mathijs Segers:
(Использует некоторые AngularJS, но, надеюсь, вы получите эту идею.)
<label style='position:relative'>
<input type="date"
name="dateField"
onfocus="(this.type='date')"
ng-focus="dateFocus=true" ng-blur="dateFocus=false" />
<span ng-if='!dateFocus && !form.date' class='date-placeholder'>
Enter date
</span>
</label>
Поскольку все это завернуто в label
, нажатие span
автоматически фокусирует input
.
CSS:
.date-placeholder {
display: inline-block;
position: absolute;
text-align: left;
color: #aaa;
background-color: white;
cursor: text;
/* Customize this stuff based on your styles */
top: 4px;
left: 4px;
right: 4px;
bottom: 4px;
line-height: 32px;
padding-left: 12px;
}