Existe-t-il un moyen d'utiliser le widget Datepicker de l'interface utilisateur jQuery pour sélectionner plusieurs dates?
Toute aide est appréciée! Si vous ne pouvez pas utiliser l’interface utilisateur jquery datepicker, y at-il quelque chose de similaire qui le fait?
J'avais besoin de faire la même chose, donc j'ai écrit du JavaScript pour l'activer, en utilisant les événements onSelect
et beforeShowDay
. Il conserve son propre tableau de dates sélectionnées. Par conséquent, malheureusement, il ne s'intègre pas dans une zone de texte affichant la date actuelle, etc. Je l'utilise simplement en tant que contrôle en ligne et je peux ensuite interroger le tableau pour connaître les dates sélectionnées.
J'ai utilisé ce code comme base.
<script type="text/javascript">
// Maintain array of dates
var dates = new Array();
function addDate(date) {
if (jQuery.inArray(date, dates) < 0)
dates.Push(date);
}
function removeDate(index) {
dates.splice(index, 1);
}
// Adds a date if we don't have it yet, else remove it
function addOrRemoveDate(date) {
var index = jQuery.inArray(date, dates);
if (index >= 0)
removeDate(index);
else
addDate(date);
}
// Takes a 1-digit number and inserts a zero before it
function padNumber(number) {
var ret = new String(number);
if (ret.length == 1)
ret = "0" + ret;
return ret;
}
jQuery(function () {
jQuery("#datepicker").datepicker({
onSelect: function (dateText, inst) {
addOrRemoveDate(dateText);
},
beforeShowDay: function (date) {
var year = date.getFullYear();
// months and days are inserted into the array in the form, e.g "01/01/2009", but here the format is "1/1/2009"
var month = padNumber(date.getMonth() + 1);
var day = padNumber(date.getDate());
// This depends on the datepicker's date format
var dateString = month + "/" + day + "/" + year;
var gotDate = jQuery.inArray(dateString, dates);
if (gotDate >= 0) {
// Enable date so it can be deselected. Set style to be highlighted
return [true, "ui-state-highlight"];
}
// Dates not in the array are left enabled, but with no extra style
return [true, ""];
}
});
});
</script>
Avec l'agenda jQuery UI, ce plugin vous permet de choisir plusieurs dates:
http://dubrox.github.io/Multiple-Dates-Picker-for-jQuery-UI/
Lorsque vous le modifiez un peu, cela fonctionne quel que soit le format de date que vous avez défini.
$("#datepicker").datepicker({
dateFormat: "@", // Unix timestamp
onSelect: function(dateText, inst){
addOrRemoveDate(dateText);
},
beforeShowDay: function(date){
var gotDate = $.inArray($.datepicker.formatDate($(this).datepicker('option', 'dateFormat'), date), dates);
if (gotDate >= 0) {
return [false,"ui-state-highlight", "Event Name"];
}
return [true, ""];
}
});
J'ai maintenant passé pas mal de temps à essayer de trouver un bon sélecteur de date prenant en charge les plages d'intervalles, et j'ai finalement trouvé celui-ci:
http://keith-wood.name/datepick.html
Je pense que c’est peut-être le meilleur sélecteur de date jQuery pour la sélection d’une plage ou de plusieurs dates, et il est prétendu avoir été la base du datepicker de jQuery UI. aussi bien documenté!
utiliser ceci sur:
$('body').on('focus',".datumwaehlen", function(){
$(this).datepicker({
minDate: -20
});
});
Juste eu une exigence pour cela; voici le code que j'ai utilisé. Appliquez-le à une entrée comme d'habitude, j'utilise la classe typeof__multidatepicker
.
Il maintient une liste de dates uniques dans la zone de texte du propriétaire. Vous pouvez également taper ici, ce n'est pas validé - le serveur doit évidemment vérifier la liste résultante!
J'ai essayé de le faire fonctionner avec la zone de texte liée du datepicker mais cela a échoué. Il crée donc une entrée invisible pour le datepicker (cela ne semble pas fonctionner avec display:none
, d'où le style impair).
Il est positionné sur l'entrée principale pour que le sélecteur de date apparaisse au bon endroit et mesure 1px en largeur afin que vous puissiez toujours taper dans la zone de texte principale.
C'est pour un intranet avec une plate-forme fixe, donc je n'ai pas fait beaucoup de tests sur plusieurs navigateurs.
N'oubliez pas d'inclure le gestionnaire dans la variable body
ou cela fonctionnera de manière confuse.
$('.typeof__multidatepicker').each(
function()
{
var _this = $(this);
var picker = $('<input tabindex="-1" style="position:absolute;opacity:0;width:1px" type="text"/>');
picker.insertAfter(this)
.position({my:'left top', at:'left top', of:this})
.datepicker({
beforeShow:
function()
{
_this.data('mdp-popped', true);
},
onClose:
function(dt, dpicker)
{
var date = $.datepicker.formatDate(picker.datepicker('option', 'dateFormat'), picker.datepicker('getDate'));
var hash = {};
var curr = _this.val() ? _this.val().split(/\s*,\s*/) : [];
var a = [];
$.each(curr,
function()
{
if(this != '' && !/^\s+$/.test(this))
{
a.Push(this);
hash[this] = true;
}
}
);
if(date && !hash[date])
{
a.Push(date);
_this.val(a.join(', '));
}
_this.data('mdp-popped', false);
_this.data('mdp-justclosed', true);
}
});
_this.on('focus',
function(e)
{
if(!_this.data('mdp-popped') && !_this.data('mdp-justclosed'))
_this.next().datepicker('show');
_this.data('mdp-justclosed', false);
}
);
}
);
$('body').on('click', function(e) { $('.typeof__multidatepicker').data('mdp-justclosed', false); });
<div id="calendar"></div>
<script>
$(document).ready(function() {
var days = [];
$('#calendar').datepicker({
dateFormat: 'yymmdd',
showWeek: true, showOtherMonths: false, selectOtherMonths: false,
navigationAsDateFormat: true, prevText: 'MM', nextText: 'MM',
onSelect: function(d) {
var i = $.inArray(d, days);
if (i == -1)
days.Push(d);
else
days.splice(i, 1);
},
beforeShowDay: function(d) {
return ([true, $.inArray($.datepicker.formatDate('yymmdd', d), days) == -1 ? 'ui-state-free' : 'ui-state-busy']);
}
});
});
</script>
NOTE: Vous pouvez pré-remplir days
avec une liste de dates comme '20190101'
avec un morceau de code en PHP.
Ajoutez 2 lignes à votre CSS:
#calendar .ui-state-busy a {background:#e6e6e6 !important;}
#calendar .ui-state-free a {background:none !important;}
Pour obtenir la liste des jours sélectionnés par le calendrier dans un <form>
:
<div id="calendar"></div>
<form method="post">
<input type="submit" name="calendar_get" id="calendar_get" value="Validate" />
</form>
Ajoutez ceci au <script>
:
$('#calendar_get').click(function() {
$(this).append('<input type="hidden" name="calendar_days" value="' + days.join(',') + '" />');
});
Appliquez implode
sur la chaîne dans $_POST['calendar_days']
et mappez strtotime
à toutes les dates formatées.
Utilisez ce pluginhttp://multidatespickr.sourceforge.net