Générer dynamiquement une liste déroulante de sélection de temps avec des intervalles (Javascript ou JQuery)

Générer dynamiquement HTML Les éléments basés sur les entrées de l’utilisateur ou sur des conditions spécifiques sont une exigence courante dans le développement Web. L’un de ces scénarios consiste à créer des listes déroulantes de temps qui ajustent leurs options en fonction de l’heure actuelle, de la plage souhaitée et des intervalles. Cet article présente une solution JavaScript ou jQuery pour créer des listes déroulantes de temps dynamiques dans un select
élément de formulaire.
Pourquoi des listes déroulantes de temps dynamiques ?
Les listes déroulantes dynamiques de temps sont utiles dans de nombreuses situations :
- Prise de rendez-vous : Permettez aux utilisateurs de sélectionner des plages horaires qui s’ajustent en fonction de la disponibilité en temps réel.
- Prestations de réservation : Proposez des options horaires pour les services proposés uniquement à des heures spécifiques ou à certains intervalles.
- Définir des rappels : Permettez aux utilisateurs de définir des rappels avec des options d’heure flexibles, à partir de l’heure actuelle ou dans une plage spécifique.
- Expérience utilisateur améliorée : Présentez aux utilisateurs des choix de temps pertinents, en évitant les défilements inutiles et la confusion.
Solution de temps dynamique utilisant JavaScript
La solution JavaScript ci-dessous vous permet de créer des menus déroulants temporels dynamiques sur vos pages Web. Ces menus s’adaptent à différents scénarios et offrent aux utilisateurs des choix horaires pertinents.
Voici ce qu’il propose :
- Plages horaires flexibles : Définissez les heures de début et de fin pour les options déroulantes. Vous pouvez même utiliser l’heure actuelle pour démarrer ou terminer dynamiquement les options à l’heure actuelle.
- Intervalles personnalisables : Définissez les intervalles entre les options de temps, que ce soit toutes les 15 minutes, 30 minutes ou toute autre durée.
- Formats d’affichage variés : Contrôlez la façon dont l’heure est affichée, en choisissant entre les formats 12 heures ou 24 heures avec des indicateurs AM/PM selon vos besoins.
- Commencez dès maintenant : Configurez la liste déroulante pour commencer par l’heure actuelle, ce qui la rend idéale pour les scénarios de planification ou de réservation.
- Couverture d’une journée complète : Si aucune plage horaire spécifique n’est fournie, la liste déroulante proposera par défaut des options pour toute la journée.
- Gestion intelligente des vides : Si aucune option de temps valide ne peut être générée sur la base des paramètres donnés, la liste déroulante sera automatiquement désactivée pour éviter toute confusion de l’utilisateur.
Cette solution améliore l’expérience utilisateur en présentant uniquement les choix temporels pertinents, en éliminant le défilement inutile et en rendant les interactions plus fluides. Que vous créiez une application de planification, un système de réservation ou toute autre fonctionnalité nécessitant une sélection d’heure, ce code JavaScript offre la flexibilité et le contrôle dont vous avez besoin.
Exemples de temps dynamique
- Exemple 1 : Journée complète, intervalles de 30 minutes, format 24 heures
<select class="timeSelect" data-from="" data-to="" data-interval="30" data-start-now="false" data-format="H:i"></select>
- Exemple 2 : Commencer à partir de maintenant, terminer à 20 h, intervalles de 15 minutes, format de 12 heures
<select class="timeSelect" data-from="" data-to="" data-interval="30" data-start-now="false" data-format="H:i"></select>
- Exemple 3 : Commencer à 10 heures, Finir à maintenant, intervalles d’une heure, format 24 heures
<select class="timeSelect" data-from="10" data-to="now" data-interval="60" data-start-now="false" data-format="H:i">
- Exemple 4 : Début à 14h, Fin à 18h, intervalles de 10 minutes, format 12 heures avec AM/PM minuscules
<select class="timeSelect" data-from="14" data-to="18" data-interval="10" data-start-now="false" data-format="h:i a"></select>
- Exemple 5 : Commencez maintenant jusqu’à avant minuit avec des intervalles de 30 minutes
<select class="timeSelect" data-from="" data-to="23" data-interval="15" data-start-now="true" data-format="H:i">
</select>
JavaScript temporel dynamique
Voici le code JavaScript complet pour créer des listes déroulantes de temps dynamiques :
function getTime(from, to, interval, startNow, format, timeSelect) {
var select="<option value="">Select a Time</option>";
var now = new Date();
var currentHour = now.getHours();
var currentMinute = now.getMinutes();
var optionsCount = 0;
if (from === "now") {
from = currentHour;
} else if (from === "") {
from = 0;
} else {
from = parseInt(from);
}
if (to === "now") {
to = currentHour;
} else if (to === "") {
to = 23;
} else {
to = parseInt(to);
}
if (startNow) {
if (from < currentHour) {
from = currentHour;
}
if (to < currentHour) {
to = currentHour;
}
}
for (var hour = from; hour <= to; hour++) {
var hour12 = hour > 12 ? hour - 12 : hour;
hour12 = hour12 === 0 ? 12 : hour12; // Change 0 to 12 for 12 AM
var ampm = hour >= 12 ? 'PM' : 'AM';
for (var min = 0; min < 60; min += interval) {
if (startNow && hour === currentHour && min < currentMinute) {
continue;
}
var min0 = min < 10 ? '0' + min : min;
var date = new Date();
date.setHours(hour);
date.setMinutes(min);
var value = formatDate(date, format);
select += '<option value="' + value + '">' + hour12 + ':' + min0 + ' ' + ampm + '</option>';
optionsCount++;
}
}
timeSelect.innerHTML = select;
if (optionsCount <= 1) {
timeSelect.disabled = true;
}
}
function formatDate(date, format) {
var hours = date.getHours();
var minutes = date.getMinutes();
var ampm = hours >= 12 ? 'PM' : 'AM';
hours = hours % 12;
hours = hours ? hours : 12; // the hour '0' should be '12'
minutes = minutes < 10 ? '0'+minutes : minutes;
var strTime = hours + ':' + minutes + ' ' + ampm;
return format
.replace(/H/g, date.getHours())
.replace(/h/g, hours)
.replace(/i/g, minutes)
.replace(/s/g, date.getSeconds())
.replace(/a/g, ampm.toLowerCase())
.replace(/A/g, ampm);
}
var timeSelects = document.querySelectorAll('.timeSelect');
timeSelects.forEach(function(timeSelect) {
var from = timeSelect.dataset.from;
var to = timeSelect.dataset.to;
var interval = parseInt(timeSelect.dataset.interval);
var startNow = timeSelect.dataset.startNow === 'true';
var format = timeSelect.dataset.format;
getTime(from, to, interval, startNow, format, timeSelect);
});
Décrypter le code
Maintenant, décomposons le code pour nos lecteurs :
1. Structure HTML :
- Nous utilisons
<select>
éléments avec la classetimeSelect
pour créer les menus déroulants. - Chaque
select
a des attributs de données :data-from
: L’heure de début (ou « maintenant »).data-to
: L’heure de fin (ou « maintenant »).data-interval
: L’intervalle en minutes.data-start-now
: s’il faut démarrer à partir de l’heure actuelle.data-format
: Le format de l’heure (par exemple, « H:i », « h:i A »).
2. Fonctions JavaScript :
getTime(from, to, interval, startNow, format, timeSelect)
:- Cette fonction fait le gros du travail. Il prend les paramètres des attributs de données et le
select
élément lui-même. - Il calcule la plage de temps en fonction de
from
etto
compte tenu dustartNow
option et l’heure actuelle. - Il génère les options de temps avec le spécifié
interval
. - Il formate les valeurs de temps en utilisant le
formatDate()
fonction. - Il remplit le donné
select
élément avec les options générées. - Il désactive le
select
s’il n’y a pas d’options valides.
- Cette fonction fait le gros du travail. Il prend les paramètres des attributs de données et le
formatDate(date, format)
:- Cette fonction d’assistance formate l’objet date selon la chaîne de format fournie, similaire au formatage de date PHP.
3. Initialisation :
- Le code sélectionne tous les éléments avec la classe
timeSelect
en utilisantquerySelectorAll()
. - Il parcourt ensuite chacun
select
élément utilisantforEach()
. - Pour chacun
select
il récupère les paramètres des attributs de données. - Il appelle le
getTime()
fonctionner avec les paramètres et lesselect
élément pour générer et remplir les options.
Temps dynamique jQuery
Si vous utilisez jQuery, voici la solution réécrite.
function getTime(from, to, interval, startNow, format, $timeSelect) {
var selectOptions="<option value="">Select a Time</option>";
var now = new Date();
var currentHour = now.getHours();
var currentMinute = now.getMinutes();
var optionsCount = 0;
if (from === "now") {
from = currentHour;
} else if (from === "") {
from = 0;
} else {
from = parseInt(from);
}
if (to === "now") {
to = currentHour;
} else if (to === "") {
to = 23;
} else {
to = parseInt(to);
}
if (startNow) {
if (from < currentHour) {
from = currentHour;
}
if (to < currentHour) {
to = currentHour;
}
}
for (var hour = from; hour <= to; hour++) {
var hour12 = hour > 12 ? hour - 12 : hour;
hour12 = hour12 === 0 ? 12 : hour12;
var ampm = hour >= 12 ? 'PM' : 'AM';
for (var min = 0; min < 60; min += interval) {
if (startNow && hour === currentHour && min < currentMinute) {
continue;
}
var min0 = min < 10 ? '0' + min : min;
var date = new Date();
date.setHours(hour);
date.setMinutes(min);
var value = formatDate(date, format);
selectOptions += '<option value="' + value + '">' + hour12 + ':' + min0 + ' ' + ampm + '</option>';
optionsCount++;
}
}
$timeSelect.html(selectOptions);
if (optionsCount <= 1) {
$timeSelect.prop('disabled', true);
}
}
function formatDate(date, format) {
var hours = date.getHours();
var minutes = date.getMinutes();
var ampm = hours >= 12 ? 'PM' : 'AM';
hours = hours % 12;
hours = hours ? hours : 12;
minutes = minutes < 10 ? '0'+minutes : minutes;
var strTime = hours + ':' + minutes + ' ' + ampm;
return format
.replace(/H/g, date.getHours())
.replace(/h/g, hours)
.replace(/i/g, minutes)
.replace(/s/g, date.getSeconds())
.replace(/a/g, ampm.toLowerCase())
.replace(/A/g, ampm);
}
$(document).ready(function() {
$('.timeSelect').each(function() {
var $timeSelect = $(this);
var from = $timeSelect.data('from');
var to = $timeSelect.data('to');
var interval = parseInt($timeSelect.data('interval'));
var startNow = $timeSelect.data('start-now') === true;
var format = $timeSelect.data('format');
getTime(from, to, interval, startNow, format, $timeSelect);
});
});
Cette approche permet plusieurs listes déroulantes temporelles sur la même page, chacune avec sa configuration et son comportement. Le code gère divers scénarios, y compris les sélections d’une journée complète, à partir de l’heure actuelle et de différents formats d’heure, offrant ainsi une solution flexible et conviviale pour la sélection dynamique de l’heure.
Source link