Valider 5cdc7b5b rédigé par Eric Lupinacci's avatar Eric Lupinacci
Parcourir les fichiers

Passage de jQuery à Vanilla JS

parent c4bc94aa
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+54 −29
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
jQuery(function($){
	function init_faq() {
		$('dl.faq > dt').addClass("item-faq-closed").click(function(){
			// Bascule de l'état ouvert/fermé sur la question
			$(this).toggleClass("item-faq-closed").next().toggle('fast');
			// Mise à jour de l'état ouvert/fermé sur le bouton
			let bouton = $(this).find('> button');
			if (bouton.attr('aria-expanded') === 'true') {
				bouton.attr('aria-expanded', 'false');
			} else {
				bouton.attr('aria-expanded', 'true');
const init_faq_dl = function() {
	// Récupérer toutes les questions de FAQ qui ne sont pas encore traitées
	const questions = document.querySelectorAll('dl.faq > dt:not([data-question-loaded])');

	// Boucler sur les questions (dt) et assurer les initialisations et la gestion de l'ouverture/fermeture
	questions.forEach(
		question => {
			// Initialisation des dt, button et dd (ouverture/fermeture et accessibilité)
			// -- Ajouter la classe nécessaire à l'affichage de l'icone idoine (dt)
			question.classList.toggle("item-faq-closed");
			// -- Positionner l'aria expanded (button)
			question.querySelector('button').setAttribute('aria-expanded', 'false');
			// -- Faire disparaitre la réponse et positionner l'attribut aria hidden (dd)
			let reponse = question.nextElementSibling;
			reponse.hidden = true;
			reponse.style.display = 'none';

			// Gérer l'ouverture et la fermeture de la réponse par click sur la question
			question.onclick = function() {
				// Identifier l'état ouvert/fermé de la question avant le changement
				let bouton = question.querySelector('button');
				let est_ouvert = bouton.getAttribute('aria-expanded');
				let reponse = question.nextElementSibling;

				// Agir sur la réponse et son attribut hidden
				reponse.style.display = (est_ouvert === 'true') ? 'none' : 'block';
				reponse.hidden = (est_ouvert === 'true');

				// Inverser la classe du dt pour afficher le bon icone
				question.classList.toggle("item-faq-closed");

				// Assurer la cohérence de l'aria expanded du bouton
				bouton.setAttribute('aria-expanded', (est_ouvert === 'true') ? 'false' : 'true');
			}
			// Mise à jour de l'état ouvert/fermé sur la réponse
			if ($(this).next().attr('hidden')) {
				$(this).next().removeAttr('hidden');
			} else {
				$(this).next().attr('hidden', true);

			// Indiquer que la question a déjà été traitée pour éviter de le faire n fois
			question.dataset.questionLoaded = true;
		}
	)
}
			return false;
		}).next().hide();
		$('dl.faq > dt button').attr('aria-expanded', 'false');
		$('dl.faq > dd').attr('hidden', true);

// Initialisation de la FAQ
if (document.readyState !== "loading") {
	// Si le document est complètement chargé on initialise la FAQ
	init_faq_dl();
	if (window.jQuery) {
		onAjaxLoad(init_faq_dl);
    }
	init_faq();
	// Relancer lors de rechargements ajax
} else {
	// Sinon, le document n'est pas encore chargé, on ajoute l'initialisation de la FAQ
	// au chargement de la page: elle sera lancé en fin de chargement.
	document.addEventListener("DOMContentLoaded", init_faq_dl);
	if (window.jQuery) {
		$(function(){
			onAjaxLoad(init_faq);
		});
		document.addEventListener("DOMContentLoaded", () => {onAjaxLoad(init_faq_dl)});
	}
}
});
 No newline at end of file