jQuery Datepicker con input di testo che non consente l'input dell'utente


140

Come posso usare jQuery Datepicker con un input da casella di testo:

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

ciò non consente all'utente di inserire testo casuale nella casella di testo. Voglio che Datepicker appaia quando la casella di testo diventa attiva o l'utente fa clic su di essa, ma voglio che la casella di testo ignori qualsiasi input dell'utente utilizzando la tastiera (copia e incolla o qualsiasi altra). Voglio riempire la casella di testo esclusivamente dal calendario di Datepicker.

È possibile?

jQuery 1.2.6
Datepicker 1.5.2

Risposte:


269

Dovresti essere in grado di utilizzare l' attributo readonly sull'input di testo e jQuery sarà comunque in grado di modificarne il contenuto.

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

30
Per le persone che hanno Javascript disabilitato lascerei il campo di input da solo nell'HTML e fare in modo che jQuery inserisca l'attributo readonly nella pagina load $ (document) .ready (function () {$ ("# my_txtbox"). Attr 'readOnly', 'true'); }); In questo modo gli utenti con JS disattivato possono comunque scegliere una data
SimonGates,

6
questo è fantastico .. tuttavia lo stile predefinito che Chrome (e forse altri browser) aggiunge agli attributi di sola lettura è davvero spiacevole, quindi assicurati di ignorarlo
Damon

1
@FooBar Hai proposto una soluzione pratica; solo una nota che l'attuale modo preferito (come è passato del tempo dal tuo commento) per impostare l'attributo readonly è tramite il metodo prop ():$("#my_txtbox").prop('readonly', true)
Werner

2
Secondo la specifica HTML WC3, è solo <input readonly> o <input readonly = "readonly"> senza true / false w3.org/TR/html5/forms.html#the-readonly-attribute
Ankit Sharma

5
<input ... readonly="readonly" style="cursor:pointer; background-color: #FFFFFF">
Userei

61

Sulla base della mia esperienza, consiglierei la soluzione suggerita da Adhip Gupta:

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

Il seguente codice non lascerà il tipo di utente nuovi personaggi, ma sarà permettere loro di caratteri di cancellazione:

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

Inoltre, questo renderà il modulo inutile per coloro che hanno disabilitato JavaScript:

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

3
OP dovrebbe considerare di contrassegnare questa come risposta a causa dello scenario di disabilitazione JavaScript.
CeejeeB,

7
in quale universo parallelo le persone usano un normale sito web con javascript disabilitato?
d.raev l'

In che modo questa risposta JAVASCRIPT sarebbe di aiuto se JavaScript fosse disabilitato comunque?
PW Kad,

1
@PWKad aggiungendo l' readonlyattributo al campo tramite JS, ti assicuri che se JavaScript è disabilitato (e quindi non sarà in grado di usare il datepicker), possono comunque usare il modulo tramite l'inserimento manuale standard.
Jonathan Bender,

2
Al momento della scrittura, questo è il metodo preferito per impostare l'attributo di sola lettura utilizzando jQuery: $("#my_txtbox").prop('readonly', true);
Werner,

13

provare

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

L'ho usato con asp.net con successo in quanto non ha funzionato bene quando si imposta l'attributo readonly <asp: textbox> su "true"
Russ Cam

2
Ciò non impedisce a qualcuno di incollare un valore nella casella di testo per riferimenti futuri.
Erik Philips,

10

Se stai riutilizzando il selettore della data in più punti, sarebbe opportuno modificare la casella di testo anche tramite JavaScript utilizzando qualcosa come:

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

subito dopo / prima del luogo in cui inizializzi il tuo datepicker.


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

fa sì che la casella di testo perda il suo valore dopo il postback.

Dovresti piuttosto usare il suggerimento di Brad8118 che funziona perfettamente.

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

EDIT: per farlo funzionare per IE usa 'keydown' invece di 'keypress'


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

aggiungi l'attributo readonly nel jquery.


4

Hai due opzioni per farlo. (Per quanto ne so)

  1. Opzione A: Rendi il tuo campo di testo di sola lettura. Può essere fatto come segue.

  2. Opzione B: modifica il cursore onfocus. Imposta ti su offuscamento. può essere fatto impostando l'attributo onfocus="this.blur()"nel campo di testo del selettore della data.

Ex: <input type="text" name="currentDate" id="currentDate" onfocus="this.blur()" readonly/>


2
l'hacking era un po 'fantastico. Il campo non doveva essere di sola lettura, il che confonde alcuni utenti quando ottengono il gigantesco STOP rosso su un campo in Chrome ... impedisce il taglia e incolla, le cancellazioni, la digitazione, ecc ... e il datepicker jquery funziona ancora bene ...
David C,

4

Dopo aver inizializzato il selettore data:

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

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

O in un solo passaggio$(".project-date").datepicker().keydown(false);
Christian Lescuyer,

3

Per appuntare il pop-up in modo da ottenere focus:

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

Se non si desidera l'input dell'utente, aggiungerlo al campo di input

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

3

Mi sono appena imbattuto in questo, quindi condivido qui. Ecco l'opzione

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

Ecco il codice

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
});

Ecco il violino:

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

La mia versione di bootstrap-datetimepicker.js è la 4.17.45


1

Questo tipo di demo lo fa posizionando il calendario sul campo di testo in modo da non poterlo digitare. Per sicurezza, puoi anche impostare il campo di input in modo che sia solo in HTML.

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

1

HTML

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

CSS

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

1

So che questa discussione è vecchia, ma per gli altri che riscontrano lo stesso problema, quella implementa la soluzione @ Brad8118 (che preferisco, perché se scegli di effettuare l'input in sola lettura, l'utente non sarà in grado di eliminare il valore della data inserito da datepicker se sceglie) e deve anche impedire all'utente di incollare un valore (come suggerito da @ErikPhilips), lascio qui questa aggiunta, che ha funzionato per me: $("#my_txtbox").bind('paste',function(e) { e.preventDefault(); //disable paste });da qui https://www.dotnettricks.com/learn/ jquery / disable-cut-copy-and-paste-in-textbox-using-jquery-javascript e l'intero script specifico usato da me (usando invece il plugin 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;


0

Ho scoperto che il plug-in del calendario jQuery, almeno per me, in generale funziona meglio per la selezione delle date.


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

0

Ecco la tua risposta che è il modo di risolvere. Non vuoi usare jquery quando hai limitato l'input dell'utente nel controllo della casella di testo.

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

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

0

$ ("# my_txtbox"). prop ('readonly', true)

ha funzionato come un fascino ..


0

Invece di usare la casella di testo puoi usare anche il pulsante. Funziona meglio per me, dove non desidero che gli utenti scrivano manualmente la data.

inserisci qui la descrizione dell'immagine


0

So che questa domanda ha già una risposta e la maggior parte ha suggerito di usare l' readonlyattribuzione.
Voglio solo condividere il mio scenario e rispondere.

Dopo aver aggiunto l' readonlyattributo al mio elemento HTML , ho riscontrato il problema che non sono in grado di rendere questo attributo in requiredmodo dinamico.
Ho anche provato a impostare entrambi readonlye requiredal momento della creazione di HTML.

Quindi suggerirò di non utilizzare readonlyse si desidera impostarlo requiredanche come .

Invece usa

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

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

Ciò consente di premere tabsolo il tasto.
È possibile aggiungere più codici chiave che si desidera ignorare.

Ho sotto il codice poiché ho aggiunto entrambi readonlye requiredinvia ancora il modulo.
Dopo readonlyaverlo rimosso funziona correttamente.

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>


0

sostituire l'ID del selettore tempo: IDofDatetimePicker al tuo ID.

Ciò impedirà all'utente di immettere ulteriori input da tastiera, ma l'utente sarà comunque in grado di accedere al popup temporale.

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

Prova questa fonte: https://github.com/jonthornton/jquery-timepicker/issues/109


0

Questa domanda ha molte risposte più vecchie e di sola lettura sembra essere la soluzione generalmente accettata. Credo che l'approccio migliore nei browser moderni sia utilizzare il inputmode="none"tag di input HTML:

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

oppure, se preferisci farlo nello script:

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

Non l'ho testato ampiamente, ma funziona bene con le configurazioni Android con cui l'ho usato.


Stavo codificando questo progetto principalmente per Android mobile. Ymmv con altre piattaforme.
Peter Bowers,

-1

Oppure potresti, ad esempio, utilizzare un campo nascosto per memorizzare il valore ...

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

e in $ ("# my_txtbox"). datepicker ({opzioni:

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

-1

Se si desidera che l'utente selezioni una data dal datepicker ma non si desidera che l'utente digiti all'interno della casella di testo, utilizzare il seguente codice:

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

});

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.