11522 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

J'ai créé une petite PWA pour moi et mes collègues infirmiers et ASH. Au début c'est partit comme une blague et puis je me suis pris au jeu... et voilà : planning

Ca fonctionne très bien... sauf sous iPhone : au moment de configurer un calendrier j'ai une alerte qui ne devrait pas se lancer dans tous les cas de figure (github) :
// Gestionnaire d'événement pour la date de début
startDateInput.addEventListener('change', function () {
  const selectedDate = new Date(this.value)
  const day = selectedDate.getDay()

  if (day !== 1) {
    alert('Veuillez sélectionner un lundi.')
    this.value = ''
  } else {
    localStorage.setItem('startDate', this.value)
  }
})

La condition du script a pour fonction de filtrer l'entrée à un lundi obligatoirement, cependant le message sort sur iPhone même lorsque les conditions d'usage sont respectées. J'imagine un problème de format de l'input de type date sous Mac OS qui, du coup, ne correspondrait jamais au format attendu par le script, mais je n'ai rien pour tester...

Qu'en pensez-vous ? Et surtout comment remédier au problème ?
Modifié par Olivier C (24 Nov 2024 - 13:46)
Déjà je vais faire ça, ça devrait déjà régler mon premier problème :
// Vérifiez si la valeur est vide
if (!this.value) {
  return; // Ne pas procéder si la date n'est pas définie
}

Reste l'autre problème. Je vais voir si je ne peux pas formater la date pour mettre tout le monde d'accord.
Ça me rend fou !

J'ai créé un codepen bug on iPhone

Voici l'état actuel du script :


document.addEventListener('DOMContentLoaded', () => {
  const startDateInput = document.getElementById('start-date')

  // Gestionnaire d'événement pour la date de début
  startDateInput.addEventListener('change', function () {
    if (!this.value) {
      return;
    }
    
    const selectedDate = new Date(this.value)
    
    if (isNaN(selectedDate.getTime())) {
      alert(`Date invalide. Veuillez réessayer.`)
      this.value = ''
      return
    }
    
    const day = selectedDate.getUTCDay()

    // Vérifiez si le jour sélectionné est un lundi (1 dans getDay())
    if (day !== 1) {
      alert(`Veuillez sélectionner un lundi.`)
      this.value = ''
    } else {
      localStorage.setItem('startDate', this.value)
    }
  })
})

<input id="start-date" type="date"/>
Je viens de coller quelques logs directement dans la page pour débugger (parce que je n'ai pas de iPhone et que je contrôle directement sur celui d'une collègue compatissante). La plupart des OS me retournent un 1 pour lundi :
Valeur brute : 2024-11-04
Date interprétée : 2024-11-04T00:00:00.000Z
Jour de la semaine (0=Dimanche) : 1
Date correctement enregistrée dans localStorage.


Sur iPhone, j'ai d'abords une valeur 0, ensuite donc mon alert, puis au final la sélection se fait bien sur le lundi choisi :
Valeur brute : 2024-11-04
Date interprétée : 2024-11-04T00:00:00.000Z
Jour de la semaine (0=Dimanche) : 0
Erreur : Le jour sélectionné n’est pas un lundi.

Donc c'est comme s'il y avait une initialisation à 0 d'abord et qu'ensuite le champ émettait une erreur avant de prendre correctement la valeur du champ...

Argh !!! comment on résout un truc pareil ?
En attendant de trouver une solution j'ai fait un truc bien atroce :
function isIphone() {
  return /iPhone|iPad|iPod/i.test(navigator.userAgent)
}

if (isIphone()) { // @todo Solution à revoir.
  return
}