JQuery Datepicker с вводом текста, который не позволяет вводить данные пользователем

Как использовать jQuery Datepicker с вводом текстового поля:

$("#my_txtbox").datepicker({
  // options
});

это не позволяет пользователю вводить случайный текст в текстовое поле. Я хочу, чтобы Datepicker всплывал, когда текстовое поле получает фокус или пользователь нажимает на него, но я хочу, чтобы текстовое поле игнорировало любой ввод пользователя с клавиатуры (копирование и вставка или любое другое). Я хочу заполнить текстовое поле исключительно из календаря Datepicker.

Это возможно?

jQuery 1.2.6
Datepicker 1.5.2

Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
145
0
250 410
24
Перейти к ответу Данный вопрос помечен как решенный

Ответы 24

Ответ принят как подходящий

Вы должны иметь возможность использовать атрибут только чтение для ввода текста, и jQuery по-прежнему сможет редактировать его содержимое.

<input type='text' id='foo' readonly='true'>

Для людей, у которых отключен Javascript, я бы оставил поле ввода только в HTML, а бит jQuery поместил бы атрибут readonly на загрузку страницы $ (document) .ready (function () {$ ("# my_txtbox"). Attr 'readOnly', 'истина'); }); Таким образом, пользователи с отключенным JS все еще могут выбрать дату

SimonGates 29.03.2011 15:49

это здорово ... однако стиль по умолчанию, который Chrome (и, возможно, другие браузеры) добавляет к атрибутам readonly, действительно неприятен, поэтому убедитесь, что вы переопределили его

Damon 07.06.2012 23:35

Внимание. С readonly datepicker конечный пользователь сможет управлять значение поля выбирает другую дату из datepicker, как в этой ошибке: bugs.jqueryui.com/ticket/13107

Serge 11.06.2015 18:07

@FooBar Вы предложили практическое решение; просто обратите внимание, что текущий предпочтительный способ (прошло некоторое время с момента вашего комментария) для установки атрибута readonly через метод prop (): $("#my_txtbox").prop('readonly', true)

Werner 12.06.2015 12:32

@Werner спасибо за совет ..... Забавно, потому что 4 года спустя .... Я больше не беспокоюсь о людях с отключенным JavaScript :)

SimonGates 16.06.2015 18:04

Согласно спецификации HTML WC3, это только <input readonly> или <input readonly = "readonly"> без true / false w3.org/TR/html5/forms.html#the-readonly-attribute

Ankit Sharma 21.09.2016 17:13

Я бы использовал указатель курсора, чтобы он выглядел интерактивным <input ... readonly = "readonly" style = "cursor:pointer; background-color: #FFFFFF">

Benjamin Lucidarme 19.05.2017 14:46

Чтобы всплывающее окно выбора даты при фокусировке:

$(".selector").datepicker({ showOn: 'both' })

Если вам не нужен ввод данных пользователем, добавьте это в поле ввода

<input type = "text" name = "date" readonly = "readonly" />

пытаться

$("#my_txtbox").keypress(function(event) {event.preventDefault();});

Я успешно использовал это с asp.net, так как это не помогло, когда для атрибута <asp: textbox> readonly было установлено значение «true».

Russ Cam 01.12.2008 21:05

Это не мешает кому-либо вставить значение в текстовое поле для использования в будущем.

Erik Philips 21.09.2010 08:26

Этот тип демонстрация делает это, помещая календарь поверх текстового поля, чтобы вы не могли его вводить. Вы также можете установить поле ввода только для чтения в HTML, чтобы быть уверенным.

<input type = "text" readonly = "true" />

Я обнаружил, что плагин jQuery Calendar, по крайней мере для меня, в целом работает лучше для выбора дат.

Если вы повторно используете средство выбора даты в нескольких местах, можно изменить текстовое поле также с помощью JavaScript, используя что-то вроде:

$("#my_txtbox").attr( 'readOnly' , 'true' );

сразу после / перед местом, где вы инициализируете свой датпикер.

<input type = "text" readonly = "true" />

заставляет текстовое поле терять свое значение после обратной передачи.

Вам лучше использовать предложение Brad8118, которое отлично работает.

$("#my_txtbox").keypress(function(event) {event.preventDefault();});

Обновлено: чтобы заставить его работать в IE, используйте keydown вместо keypress

Исходя из своего опыта, я бы порекомендовал решение, предложенное Адипом Гуптой:

$("#my_txtbox").attr( 'readOnly' , 'true' );

Следующий код не позволяет пользователю вводить новые символы, но воля позволяет им удалять символы:

$("#my_txtbox").keypress(function(event) {event.preventDefault();});

Кроме того, это сделает форму бесполезной для тех, у кого отключен JavaScript:

<input type = "text" readonly = "true" />

OP следует подумать о том, чтобы пометить это как ответ из-за сценария отключения JavaScript.

CeejeeB 21.09.2012 18:24

в какой параллельной вселенной люди используют обычный веб-сайт с отключенным javascript?

d.raev 11.12.2013 12:04

Как бы этот JAVASCRIPT ответил на помощь, если бы JavaScript все равно был отключен?

PW Kad 06.11.2014 01:45

@PWKad, добавив атрибут readonly в поле через JS, вы гарантируете, что если у них отключен JavaScript (и, следовательно, они не смогут использовать datepicker), они все равно смогут использовать форму посредством стандартного ручного ввода.

Jonathan Bender 18.11.2014 00:35

На момент написания это предпочтительный способ установки атрибута только для чтения с помощью jQuery: $("#my_txtbox").prop('readonly', true);

Werner 12.06.2015 12:29

Или вы можете, например, использовать скрытое поле для хранения значения ...

        <asp:HiddenField ID = "hfDay" runat = "server" />

и в $ ("# my_txtbox"). datepicker ({options:

        onSelect: function (dateText, inst) {
            $("#<% =hfDay.ClientID %>").val(dateText);
        }

Если вы хотите, чтобы пользователь выбрал дату в окне выбора даты, но не хотите, чтобы пользователь вводил данные в текстовое поле, используйте следующий код:

<script type = "text/javascript">
$(function () {
    $("#datepicker").datepicker({ maxDate: "-1D" }).attr('readonly', 'readonly');
    $("#datepicker").readonlyDatepicker(true);

});

$('.date').each(function (e) {
    if ($(this).attr('disabled') != 'disabled') {
        $(this).attr('readOnly', 'true');
        $(this).css('cursor', 'pointer');
        $(this).css('color', '#5f5f5f');
    }
});

У вас есть два варианта сделать это. (Насколько мне известно)

  1. Вариант А: Сделайте текстовое поле доступным только для чтения. Это можно сделать следующим образом.

  2. Вариант Б: Смена курсора при фокусе. Установите ti на размытие. это можно сделать, установив атрибут onfocus = "this.blur()" в текстовое поле выбора даты.

Пример: <input type = "text" name = "currentDate" id = "currentDate" onfocus = "this.blur()" readonly/>

взлом размытия был просто потрясающим. Поле не должно быть только для чтения, что смущает некоторых пользователей, когда они получают гигантский красный STOP в поле в Chrome ... он предотвращает вырезание и вставку, удаление, ввод текста и т.д ... и jquery datepicker по-прежнему работает нормально ...

David C 17.06.2015 18:06

HTML

<input class = "date-input" type = "text" readonly = "readonly" />

CSS

.date-input {
      background-color: white;
      cursor: pointer;
}

Вот ваш ответ, который является способом решения. Вы не хотите использовать jquery, когда вы ограничили ввод пользователя в элемент управления текстовым полем.

<input type = "text" id = "my_txtbox" readonly />  <!--HTML5-->

<input type = "text" id = "my_txtbox" readonly = "true"/>

$("#txtfromdate").datepicker({         
    numberOfMonths: 2,
    maxDate: 0,               
    dateFormat: 'dd-M-yy'       
}).attr('readonly', 'readonly');

добавьте атрибут readonly в jquery.

$ ("# my_txtbox"). prop ('только для чтения', истина)

работал как шарм ..

Вместо текстового поля вы также можете использовать кнопку. Лучше всего работает для меня, когда я не хочу, чтобы пользователи писали дату вручную.

После инициализации средства выбора даты:

$(".project-date").datepicker({
    dateFormat: 'd M yy'
});

$(".project-date").keydown(false);

Или за один шаг $(".project-date").datepicker().keydown(false);

Christian Lescuyer 13.05.2017 16:08

Я только что наткнулся на это, поэтому делюсь здесь. Вот вариант

https://eonasdan.github.io/bootstrap-datetimepicker/Options/#ignorereadonly

Вот код.

HTML

<br/>
<!-- padding for jsfiddle -->
<div class = "input-group date" id = "arrival_date_div">
  <input type = "text" class = "form-control" id = "arrival_date" name = "arrival_date" required readonly = "readonly" />
  <span class = "input-group-addon">
    <span class = "glyphicon-calendar glyphicon"></span>
  </span>
</div>

JS

$('#arrival_date_div').datetimepicker({
  format: "YYYY-MM-DD",
  ignoreReadonly: true
});

Вот рабочий пример:

http://jsfiddle.net/matbaric/wh1cb6cy/

Моя версия bootstrap-datetimepicker.js - 4.17.45

Я знаю, что на этот вопрос уже дан ответ, и большинство из них предложили использовать атрибут readonly. Я просто хочу поделиться своим сценарием и ответить.

После добавления атрибута readonly в мой HTML-элемент я столкнулся с проблемой, заключающейся в том, что я не могу динамически сделать атрибут это как required. Даже пробовал устанавливать как readonly, так и required во время создания HTML.

Поэтому я предлагаю не использовать readonly, если вы также хотите установить его как required.

Вместо этого используйте

$("#my_txtbox").datepicker({
    // options
});

$("#my_txtbox").keypress(function(event) {
    return ( ( event.keyCode || event.which ) === 9 ? true : false );
});

Это позволяет нажимать только клавишу tab. Вы можете добавить больше коды клавиш, которое хотите обойти.

Ниже приведен код, поскольку я добавил как readonly, так и required, он все еще отправляет форму. После удаления readonly работает исправно.

https://jsfiddle.net/shantaram/hd9o7eor/

$(function() {
  $('#id-checkbox').change( function(){
  	$('#id-input3').prop('required', $(this).is(':checked'));
  });
  $('#id-input3').datepicker();
  $("#id-input3").keypress(function(event) {
    return ( ( event.keyCode || event.which ) === 9 ? true : false );
});
});
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<script src = "https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<link href = "https://code.jquery.com/ui/jquery-ui-git.css" rel = "stylesheet"/>

<form action='https://jsfiddle.net/'>
Name:  <input type = "text" name='xyz' id='id-input3' readonly='true' required='true'> 
    <input type='checkbox' id='id-checkbox'> Required <br>
    <br>
    <input type='submit' value='Submit'>
</form>

заменить идентификатор средства выбора времени: IDofDatetimePicker на свой идентификатор.

Это предотвратит ввод пользователем каких-либо дополнительных вводов с клавиатуры, но, тем не менее, пользователь сможет получить доступ к всплывающему окну времени.

$ ("# my_txtbox"). keypress (функция (событие) {event.preventDefault ();});

Попробуй это источник: https://github.com/jonthornton/jquery-timepicker/issues/109

Я знаю, что этот поток старый, но для других, которые сталкиваются с той же проблемой, реализуют решение @ Brad8118 (которое я предпочитаю, потому что, если вы решите сделать ввод только для чтения, пользователь не сможет удалить значение даты, вставленное из datepicker если он выберет), а также необходимо запретить пользователю вставлять значение (как предположил @ErikPhilips), я разрешил это добавление здесь, которое сработало для меня: $("#my_txtbox").bind('paste',function(e) { e.preventDefault(); //disable paste }); отсюда https://www.dotnettricks.com/learn/jquery/disable-cut-copy-and-paste-in-textbox-using-jquery-javascript и весь конкретный скрипт, который я использовал (используя вместо этого плагин fengyuanchen / datepicker):

$('[data-toggle = "datepicker"]').datepicker({
    autoHide: true,
    pick: function (e) {
        e.preventDefault();
        $(this).val($(this).datepicker('getDate', true));
    }
}).keypress(function(event) {
    event.preventDefault(); // prevent keyboard writing but allowing value deletion
}).bind('paste',function(e) {
    e.preventDefault()
}); //disable paste;

На этот вопрос есть много старых ответов, и только чтение кажется общепринятым решением. Я считаю, что лучший подход в современных браузерах - использовать inputmode = "none" во входном теге HTML:

<input type = "text" ... inputmode = "none" />

или, если вы предпочитаете делать это в скрипте:

$(selector).attr('inputmode', 'none');

Я не тестировал его всесторонне, но он хорошо работает с настройками Android, с которыми я его использовал.

Я писал этот проект в основном для мобильного Android. Ymmv с других платформ.

Peter Bowers 01.09.2019 21:47

Вместо добавления только чтение вы также можете использовать onkeypress = "вернуть ложь;"

этот совет был опубликован двумя годами ранее: stackoverflow.com/a/41892415/2943403

mickmackusa 14.12.2020 15:09

На мой взгляд, это лучший ответ, он также позволяет выполнить проверку.

GerritElbrink 04.01.2021 19:53

Другие вопросы по теме