Disparition temporaire

chabinot Messages postés 391 Statut Membre -  
chabinot Messages postés 391 Statut Membre -

Bonjour,

Voilà un bout de source 

// Language locale (fr)
moment.locale('fr-FR')

// Constantes
const now    = moment(),
timeElement  = document.querySelector('.time'),
dateElement  = document.querySelector('.date'),
dayElement   = document.querySelector('.day'),
weekElement  = document.querySelector('.week'),
resteElement = document.querySelector('.reste'),
cpyElement   = document.querySelector('.cpy'),
isLeap       = moment([moment().format('YYYY')]).isLeapYear()

// Heure
setInterval( () => {
  timeElement.textContent = moment().format('hh:mm:ss a')
}, 1000)

// Nombre de jours restant
const reste = () => {
 let restant = (isLeap ? 366 : 365) - now.format('DDD')
 console.log(isLeap)
 return restant === 0 ? '(Dernier jour de l\'année)'
                      : (restant === 1 ? '(Reste 1 jour)' : '(Reste: ' + restant + ' jours)')
}

// Date du jour
dateElement.textContent  = now.format('dddd DD MMMM YYYY')

// Jour dans l'année en cours
dayElement.textContent   = `${now.format('DDD').toString().padStart(2, "0")}`

// Semaine dans l'année en cours
weekElement.textContent  = `${now.format('w').toString().padStart(2, "0")}`

// Nombre de jours restant
resteElement.textContent = reste()

// Copyright
cpyElement.textContent    = now.format('YYYY')

Lorsque je réaffiche la page (F5), l'heure affichée disparaît momentanément.
Est-ce normal ? et comment y remédier ?

Cordialement

2 réponses

  1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     

    Bonjour

    Tout dépend le reste de ta page, mais pense bien que le javascript s'exécute après que la page a été chargée comme en plus tu utilises un timer forcément ça rajoute du temps

    Pour peu que tu aies d'autres scripts qui se charge avant celui-là ça rajoute également du temps..

    Je précise également que la librairie moment mais, il me semble, plus maintenu à cause de failles de sécurité qui ont été trouvées à l'intérieur...

    Si c'est juste pour afficher l'heure, les fonctions natives de JavaScript suffisent largement.


    0
  2. chabinot Messages postés 391 Statut Membre 16
     

    Bonjour,

    Effectivement, je l'ai refait, le voici :

    // Constantes
    const now    = new Date(),
    dateElement  = document.querySelector('.date'),
    dayElement   = document.querySelector('.day'),
    weekElement  = document.querySelector('.week'),
    resteElement = document.querySelector('.reste'),
    timeElement  = document.querySelector('.time'),
    cpyElement   = document.querySelector('.cpy'),
    options      = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }
    
    // Date du jour
    dateElement.innerText = now.toLocaleDateString('fr-FR', options)
    
    // Jour dans l'année en cours
    const dayOfYear = date =>
      Math.floor((now - new Date(now.getFullYear(), 0, 0)) / 1000 / 60 / 60 / 24)
      dayElement.textContent = dayOfYear(now).toString().padStart(2, '0')
    
    // Semaine dans l'année en cours
    const weekOfYear = date => {
      const startOfYear = new Date(now.getFullYear(), 0, 1);
      startOfYear.setDate(startOfYear.getDate() + (startOfYear.getDay() % 7));
      return Math.round((now - startOfYear) / (7 * 24 * 3600 * 1000));
    }
    weekElement.innerText = weekOfYear(now).toString().padStart(2, '0')
    
    // Année bisextile
    const isLeap = year => new Date(year, 1, 29).getDate() === 29
    let nbJour = isLeap(now.getFullYear()) ? 366 : 365,
    restant = nbJour - dayOfYear(now)
    // Nombre de jours restant est supérieur à 1 ou égale à 0
    resteElement.innerText = (restant === 0 
                                      ? '(Dernier jour de l\'année)'
                                      : (restant === 1) 
                                      ? '(Reste: ' + restant + ' jour)'
                                      : '(Reste: ' + (nbJour - dayOfYear(now)).toString().padStart(1, '0') + ' jours)')
    
    // Copyright
    cpyElement.textContent    = now.getFullYear()
    
    // Affichage de l'heure
    setInterval( () => {
      const hour = ((new Date().getHours() % 12) || 12).toString().padStart(2, '0'),
      minute   = new Date().getMinutes().toString().padStart(2, '0'),
      second   = new Date().getSeconds().toString().padStart(2, '0'),
      amOrPm   = new Date().getHours() < 12 ? 'am' : 'pm'
      
      timeElement.innerText = `${hour}:${minute}:${second} ${amOrPm}`
    }, 1000)
    

    et la page html 

    <!DOCTYPE html>
    <html lang="fr">
    	<head>
    		<meta charset="utf-8">
    		<meta name="viewport" content="width=device-width, initial-scale=1">
    		<title>Document</title>
    		<!-- Favicon -->
    		<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
    		<!-- Styles CSS -->
    		<link rel="stylesheet" href="css/styles.css">
    		<!-- Scripts -->
    		<script src="js/date.time.js" defer></script>
    	</head>
    	<body>
    		
    		<header class="fixed-top">
    			<div class="datetime">
    				<span class="date"></span><br>
    				<span>(Jour: </span><span class="day"></span><span>)</span>
    				<span>(Semaine: </span><span class="week"></span><span>)</span><br>
    				<span class="reste"></span><span></span>
    			</div>
    			<div class="titre"><h1><a href="/">Document</a></h1></div>
    			<div class="time">
    				<span class="time"></span>
    			</div>
    		</header>
    		
    		<footer class="fixed-bottom">
    			<p>&copy; Copyright Document (2022 - <span class="cpy"></span>). Tous droits réservés </p>
    		</footer>
    		
    	</body>
    </html>

    Comme tu vois, je n'ai qu'un seul script, ça continue au réaffichage, ce n'est pas grave.

    Merci encore pour ton aide.

    0