Centre contrôle technique DEKRA

📌 Rue André Foligné Z.C. de la Croix Désilles, 35400 Saint-Malo

3.8 / 5
(45 avis)

Horaires d'Ouverture

  • Lundi 09:00–12:40, 13:30–18:00
  • Mardi 08:30–12:45, 13:30–18:00
  • Mercredi 08:30–12:45, 13:30–18:00
  • Jeudi 08:30–12:45, 13:30–18:00
  • Vendredi 08:30–12:45, 13:30–18:00
  • Samedi Fermé
  • DimancheFermé

A propos :

Découvrez toutes les informations concernant Centre de contrôle technique Centre contrôle technique DEKRA qui se situe au Rue André Foligné Z.C. de la Croix Désilles, 35400 Saint-Malo (35). Cette fiche inclut les photos, les horaires d'ouverture, l'adresse, le numéro de téléphone et les avis des clients.

Galerie Photos

Accessibilité

  • Entrée accessible en fauteuil roulant
  • Parking accessible en fauteuil roulant

Services

  • Toilettes
  • Mécanicien

Paiements

  • Paiements mobiles NFC
  • Cartes de crédit
  • Cartes de débit

Planning

  • Rendez-vous recommandés

Contribution & Gestion de la fiche

Êtes-vous le propriétaire de cet établissement ? Aidez-nous à garder cette fiche à jour ou demandez sa suppression.

🖋️ Écrire un avis (Google)

Avis des clients

Avis de : Laurence.e.
Note de : 5 / 5

"Prise de rdv super rapide A l'écoute et de bons conseils.szils Je recommande a 1000%"

Posté le 21/01/1970 à 08:50
Avis de : sureau.u.
Note de : 5 / 5

"Ponctuel très pro et sy"

Posté le 21/01/1970 à 08:10
Avis de : Agnes.i.
Note de : 5 / 5

"Ponctuel et rapide"

Posté le 21/01/1970 à 07:42
Avis de : T..
Note de : 1 / 5

"J'aurai dû lire les avis avant. Politique de contre visite abusive. 20€ pour vérifier le changement de deux pneus, 5 minutes montre en main même avec le zèle de re-contrôler la pression de pneus changés la veille, soit 240€ de l'heure 👏! Vous avez gagné 20€ cette fois mais perdez un client à vie donc 75€ tout les 2 ans. Commercialement peu intelligent."

Posté le 21/01/1970 à 06:26
Avis de : MICHEL.A.
Note de : 5 / 5

"RDV rapide, il faut privilégier un rdv sur internet, petite réduction, ce qui n est pas négligeable"

Posté le 21/01/1970 à 05:50
Avis de : Olivier.I.
Note de : 5 / 5

"Efficace et pro !Contrôle technique de ma FIAT : service rapide, personnel compétent et explications claires. Je recommande !"

Posté le 21/01/1970 à 04:54
Avis de : Patrice...
Note de : 5 / 5

"Je recommande particulièrement ce centre de contrôle technique. Professionnel, ponctuel dans ses rendez vous pris sur internet et courtoisie. Ne rien changer, surtout. Du coup mes trois véhicules y sont passées."

Posté le 21/01/1970 à 04:44
Avis de : Yonni.e.
Note de : 1 / 5

"L' amabilité inexistante Blazer de son travail il serait temps penser à une reconversion professionnelle en porte de prison. A éviter à tout prix préférer celui de l'avenue du général !! L'étoile c'est juste parce que c'est obligatoire"

Posté le 21/01/1970 à 04:40
Avis de : Olivier.o.
Note de : 1 / 5

"Même remarque qu’Ameline, tarif abusif : contre-visite à 30€ pour contrôler pneus et plaquettes. Ils sont froids et peu commerçants, ils profitent de faire des contres visites à 30€ avec de fausse excuse quand la concurrence prend 15€ (sans être client chez eux et sans négocier) et en souriant alors qu’eux ne sont guère accueillant. Nos 3 véhicules n’iront plus chez eux que nous avions choisi pour la proximité de Leclerc."

Posté le 20/01/1970 à 23:56
Avis de : Maryanick.m.
Note de : 1 / 5

"Bonjour, Je tiens à partager mon mécontentement relatif à une contre visite après un refus du contrôle technique pour défaut d'airbag. Je dépose ma voiture à 15h30 et je reste sur place pour voir le déroulement. A 15h40 le technicien monte dans ma voiture pour l'avancer dans le garage. Il procède aux vérifications et à 15h45, il remet le véhicule sur le parking. Il me réclame alors 30 euros ! Je lui fais remarquer que cela est très cher pour 5 minutes tout compris !.... Avec froideur et mépris il me dit c'est le tarif, les prix sont affichés. Effectivement j'en avais pris connaissance, et je lui demande pour quoi pas le premier prix 20 € correspondant à une visite visuelle, réponse j'ai des papiers à faire et je ne suis pas le patron..... Mon véhicule n'a pas été mis sur le banc d'essai et le capot même pas ouvert !..... Je dénonce un comportement méprisant et une démarche commerciale axée uniquement sur l'argent à tout prix. J'ai fait savoir à cette personne qu'il venait de perdre l'entretien de 2 véhicules, car dans 2 ans je ne retournerai pas dans ce garage que je déconseille fortement."

Posté le 20/01/1970 à 21:32

Entreprises à proximité

AB CARRELAGE à Saint-Malo

AB CARRELAGE

ZA des Mottais, 8 Rue des Bregeons

35400 Saint-Malo

17 Avis
Bar Lounge Le Petit Bé à Saint-Malo

Bar Lounge Le Petit Bé

1 Pl. des Frères F et Jm Lamennais

35400 Saint-Malo

340 Avis
Romé Olivier à Saint-Malo

Romé Olivier

35400 Saint-Malo

4 Avis
La Gourmand'ille à Saint-Malo

La Gourmand'ille

22 Rue de la Herse

35400 Saint-Malo

489 Avis
Banque Alimentaire de Saint Malo à Saint-Malo

Banque Alimentaire de Saint Malo

19 Rue du Grand Jardin

35400 Saint-Malo

33 Avis
BATI EMERAUDE à Saint-Malo

BATI EMERAUDE

25 Bd Léonce Demalvilain

35400 Saint-Malo

1 Avis
Locations Vacances Saint Malo à Saint-Malo

Locations Vacances Saint Malo

26 Rue de l'Étang

35400 Saint-Malo

1 Avis
Carré Chocolat à Saint-Malo

Carré Chocolat

47 Quai Duguay-Trouin

35400 Saint-Malo

183 Avis
Poisson Paysages à Saint-Malo

Poisson Paysages

ZAC du Routhouan, Imp. du Brochet

35400 Saint-Malo

12 Avis
Lariviere à Saint-Malo

Lariviere

ZI La Découverte, 30 Rue de la Ville es Cours

35400 Saint-Malo

13 Avis
SG à Saint-Malo

SG

2A Av. Jean Jaurès

35400 Saint-Malo

55 Avis
ERGO-LOGIS à Saint-Malo

ERGO-LOGIS

le cap, 54 Rue du Grand Jardin cs 11807

35400 Saint-Malo

1 Avis
Allorge Hélène à Saint-Malo

Allorge Hélène

15 D Rue Henri Lemarie

35400 Saint-Malo

0 Avis
Médicity à Saint-Malo

Médicity

3 Rue de la Maison Neuve

35400 Saint-Malo

25 Avis
Résidence Edilys La Vallée (EHPAD) à Saint-Malo

Résidence Edilys La Vallée (EHPAD)

2 All. de la Goélette

35400 Saint-Malo

21 Avis
RISKEAL à Saint-Malo

RISKEAL

35400 Saint-Malo

0 Avis
PHYTOMER Spa & Wellness - Spa Émeraude à Saint-Malo

PHYTOMER Spa & Wellness - Spa Émeraude

70 Rue du Commandant l'Herminier

35400 Saint-Malo

180 Avis
JAGOT-DUBOIS EMERAUDE GAZ SERVICES à Saint-Malo

JAGOT-DUBOIS EMERAUDE GAZ SERVICES

18 Av. du Général Ferrié

35400 Saint-Malo

13 Avis
Le Castello à Saint-Malo

Le Castello

5 Rue Jacques Cartier

35400 Saint-Malo

1009 Avis
Cycles Nicole à Saint-Malo

Cycles Nicole

11 Rue du Président Robert Schuman

35400 Saint-Malo

53 Avis
// NOUVELLES FONCTIONS POUR LE MODAL TÉLÉPHONE (SVA) const phoneModal = document.getElementById('phone-modal'); const modalPhoneDisplay = document.getElementById('modal-phone-display'); const modalCallBtn = document.getElementById('modal-call-btn'); const modalRealPhoneDisplay = document.getElementById('modal-real-phone-display'); function openPhoneModal(svaNumber) { // Remplir les données du modal avec le numéro SVA modalPhoneDisplay.textContent = svaNumber; modalCallBtn.href = 'tel:' + svaNumber.replace(/\s/g, ''); phoneModal.classList.remove('hidden'); } function closePhoneModal() { phoneModal.classList.add('hidden'); } // ANCIEN MODAL (EXIT) - Renommage de la fonction pour éviter les conflits function closeExitModal() { document.getElementById('exit-modal').classList.remove('show'); } // 1. GESTION DU BOUTON "RETOUR EN HAUT" (Optimisé) const backToTopButton = document.getElementById('backtotop'); let isBackToTopVisible = false; // État pour éviter de toucher au DOM inutilement window.addEventListener('scroll', () => { // On lit la valeur (Lecture) const shouldBeVisible = window.scrollY > 300; // On écrit dans le DOM SEULEMENT si l'état change (Écriture) if (shouldBeVisible !== isBackToTopVisible) { isBackToTopVisible = shouldBeVisible; if (isBackToTopVisible) { backToTopButton.classList.remove('hidden'); } else { backToTopButton.classList.add('hidden'); } } }, { passive: true }); // 'passive: true' améliore la fluidité du scroll backToTopButton.addEventListener('click', () => { window.scrollTo({ top: 0, behavior: 'smooth' }); }); // 2. GESTION DES TÉLÉPHONES ET DU RESTE (DOM Loaded) document.addEventListener('DOMContentLoaded', () => { const isMobile = window.innerWidth < 768; const showPhoneBtn = document.getElementById('show-phone-btn'); const showPhoneBtnFloating = document.getElementById('show-phone-btn-floating'); // Les anciens éléments d'affichage inline (phoneDisplayContainer, etc.) sont supprimés/ignorés const restaurantCard = document.querySelector('[data-place-id]'); const phoneErrorSpan = document.getElementById('phone-error'); // Éléments flottants const floatingPhoneBtn = document.getElementById('floating-phone-btn'); const phoneButtonContainer = document.getElementById('phone-button-container'); // Éléments du modal de suppression const suppressionModal = document.getElementById('suppression-modal'); const openSuppressionModal = document.getElementById('open-suppression-modal'); const openSuppressionModalBottom = document.getElementById('open-suppression-modal-bottom'); const closeSuppressionModal = document.getElementById('close-suppression-modal'); const smsHeader = document.getElementById('sms-header'); const callHeader = document.getElementById('call-header'); const smsContent = document.getElementById('sms-content'); const callContent = document.getElementById('call-content'); const smsArrow = document.getElementById('sms-arrow'); const callArrow = document.getElementById('call-arrow'); // --- LOGIQUE MODAL DE SUPPRESSION --- function toggleAccordion(header, content, arrow) { const isActive = content.classList.contains('active'); // Fermer tous les autres document.querySelectorAll('.accordion-content').forEach(c => c.classList.remove('active')); document.querySelectorAll('.accordion-arrow').forEach(a => a.classList.remove('rotate')); if (!isActive) { content.classList.add('active'); arrow.classList.add('rotate'); } } if (smsHeader && callHeader) { smsHeader.addEventListener('click', () => toggleAccordion(smsHeader, smsContent, smsArrow)); callHeader.addEventListener('click', () => toggleAccordion(callHeader, callContent, callArrow)); } // Gestion ouverture/fermeture du modal de suppression function openSuppressionModalFunc() { suppressionModal.classList.add('show'); // Réinitialiser les accordéons à l'ouverture document.querySelectorAll('.accordion-content').forEach(c => c.classList.remove('active')); document.querySelectorAll('.accordion-arrow').forEach(a => a.classList.remove('rotate')); } function closeSuppressionModalFunc() { suppressionModal.classList.remove('show'); } if (openSuppressionModal) { openSuppressionModal.addEventListener('click', openSuppressionModalFunc); } if (openSuppressionModalBottom) { openSuppressionModalBottom.addEventListener('click', openSuppressionModalFunc); } if (closeSuppressionModal) { closeSuppressionModal.addEventListener('click', closeSuppressionModalFunc); } if (suppressionModal) { suppressionModal.addEventListener('click', (e) => { if (e.target === suppressionModal) { closeSuppressionModalFunc(); } }); } // --- OPTIMISATION MAJEURE ICI : Intersection Observer au lieu de Scroll Event --- // Au lieu de calculer des maths à chaque scroll, on observe si le bouton principal sort de l'écran if (isMobile && phoneButtonContainer && floatingPhoneBtn) { const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { // Si le conteneur du bouton n'est plus visible (on a scrollé vers le bas) // On affiche le bouton flottant if (!entry.isIntersecting && entry.boundingClientRect.top < 0) { floatingPhoneBtn.classList.remove('translate-y-full'); } else { floatingPhoneBtn.classList.add('translate-y-full'); } }); }, { threshold: 0 }); // Se déclenche dès qu'un pixel sort/entre observer.observe(phoneButtonContainer); } // -------------------------------------------------------------------------------- // La fonction getPhoneNumber est mise à jour pour ouvrir le modal if (showPhoneBtn && restaurantCard && phoneErrorSpan) { const getPhoneNumber = async (btn) => { const placeId = restaurantCard.dataset.placeId; const modalRealPhoneDisplay = document.getElementById('modal-real-phone-display'); phoneErrorSpan.textContent = ''; phoneErrorSpan.classList.add('hidden'); const originalBtnContent = btn.innerHTML; // SVG Spinner inline pour éviter les sauts de ligne btn.innerHTML = `Chargement...`; btn.disabled = true; try { const response = await fetch('get_number.php?site=autour-de-moi.tel', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ place_id: placeId }) }); if (!response.ok) throw new Error(`Erreur HTTP: ${response.status}`); const data = await response.json(); const svaNumber = data.phone_number; const realNumber = modalRealPhoneDisplay.textContent; // Utilise le numéro par défaut dans le modal comme "vrai" numéro, car l'API n'en fournit qu'un. // Ouvre le modal et remplit les champs openPhoneModal(svaNumber); if (isMobile) { // Sur mobile, lancer directement l'appel SVA window.location.href = 'tel:' + svaNumber.replace(/\s/g, ''); } btn.innerHTML = originalBtnContent; btn.disabled = false; } catch (error) { console.error('Erreur:', error); // Affiche l'erreur sur le bouton ou span phoneErrorSpan.textContent = 'Erreur de connexion. Veuillez réessayer.'; phoneErrorSpan.classList.remove('hidden'); btn.innerHTML = originalBtnContent; btn.disabled = false; } }; showPhoneBtn.addEventListener('click', () => getPhoneNumber(showPhoneBtn)); if (showPhoneBtnFloating) { showPhoneBtnFloating.addEventListener('click', () => getPhoneNumber(showPhoneBtnFloating)); } } // --- GALERIE --- const galleryItems = document.querySelectorAll('.gallery-item'); if(galleryItems.length > 0) { const galleryOverlay = document.getElementById('gallery-overlay'); const galleryFullImg = document.getElementById('gallery-full-img'); const prevBtn = document.getElementById('gallery-prev'); const nextBtn = document.getElementById('gallery-next'); const closeBtn = document.getElementById('gallery-close'); let currentImageIndex = 0; let fullImages = []; galleryItems.forEach(item => { fullImages.push(item.dataset.fullImgSrc); item.addEventListener('click', () => { currentImageIndex = Array.from(galleryItems).indexOf(item); galleryFullImg.src = fullImages[currentImageIndex]; galleryOverlay.classList.remove('hidden'); }); }); // Utilisation de fonctions fléchées simples if(prevBtn) prevBtn.addEventListener('click', () => { currentImageIndex = (currentImageIndex > 0) ? currentImageIndex - 1 : fullImages.length - 1; galleryFullImg.src = fullImages[currentImageIndex]; }); if(nextBtn) nextBtn.addEventListener('click', () => { currentImageIndex = (currentImageIndex < fullImages.length - 1) ? currentImageIndex + 1 : 0; galleryFullImg.src = fullImages[currentImageIndex]; }); if(closeBtn) closeBtn.addEventListener('click', () => galleryOverlay.classList.add('hidden')); if(galleryOverlay) galleryOverlay.addEventListener('click', (e) => { if (e.target === galleryOverlay) galleryOverlay.classList.add('hidden'); }); } // --- CARROUSEL GALERIE --- const container = document.getElementById('gallery-carousel-container'); const prevGalleryBtn = document.getElementById('gallery-prev-btn'); const nextGalleryBtn = document.getElementById('gallery-next-btn'); if (container && prevGalleryBtn && nextGalleryBtn) { // Calculer scrollStep une seule fois, pas à chaque clic si possible, // ou le garder dynamique si la fenêtre change de taille prevGalleryBtn.addEventListener('click', () => { container.scrollBy({ left: -(container.offsetWidth * 0.8), behavior: 'smooth' }); }); nextGalleryBtn.addEventListener('click', () => { container.scrollBy({ left: (container.offsetWidth * 0.8), behavior: 'smooth' }); }); } // --- EXIT INTENT MODAL --- const modal = document.getElementById('exit-modal'); const closeModalBtn = document.getElementById('close-modal'); if (modal && !localStorage.getItem('visited_page')) { const showModal = () => { modal.classList.add('show'); localStorage.setItem('visited_page', 'true'); }; document.documentElement.addEventListener('mouseleave', (e) => { if (e.clientY <= 0) showModal(); }); if(closeModalBtn) closeModalBtn.addEventListener('click', () => closeExitModal()); } // --- AUTOCOMPLETE --- async function fetchAutocompleteData(phpFile, query) { try { const response = await fetch(`${phpFile}?query=${encodeURIComponent(query)}`); if (!response.ok) throw new Error(`Erreur HTTP: ${response.status}`); return await response.json(); } catch (error) { console.error("Erreur autocomplétion:", error); return []; } } function setupAutocomplete(inputId, dropdownId, phpFile) { const input = document.getElementById(inputId); const dropdown = document.getElementById(dropdownId); let timeout = null; if (!dropdown || !input) return; input.addEventListener('input', () => { const query = input.value.toLowerCase(); if (timeout) clearTimeout(timeout); if (query.length < 2) { dropdown.classList.add('hidden'); return; } // Optimisation: Afficher chargement seulement si pas trop rapide dropdown.innerHTML = '
Chargement...
'; dropdown.classList.remove('hidden'); timeout = setTimeout(async () => { const results = await fetchAutocompleteData(phpFile, query); dropdown.innerHTML = ''; if (results.length > 0) { const fragment = document.createDocumentFragment(); // Optimisation DOM results.forEach(result => { const item = document.createElement('div'); item.classList.add('autocomplete-item'); item.textContent = result; item.addEventListener('click', () => { input.value = result; dropdown.classList.add('hidden'); }); fragment.appendChild(item); }); dropdown.appendChild(fragment); } else { dropdown.innerHTML = '
Aucun résultat trouvé.
'; } }, 300); }); document.addEventListener('click', (e) => { if (!input.contains(e.target) && !dropdown.contains(e.target)) { dropdown.classList.add('hidden'); } }); } setupAutocomplete('activity-input', 'activity-dropdown', 'get_activities.php'); setupAutocomplete('city-input', 'city-dropdown', 'get_cities.php'); }); // Références aux éléments du DOM const statusDisplay = document.getElementById('status-display'); const locateButton = document.getElementById('locate-button'); const loadingSpinner = document.getElementById('loading-spinner'); const resultBox = document.getElementById('result-box'); const latitudeSpan = document.getElementById('latitude'); const longitudeSpan = document.getElementById('longitude'); const accuracySpan = document.getElementById('accuracy'); const buttonText = document.getElementById('button-text'); /** * Met à jour le statut affiché dans la boîte d'information. * @param {string} message - Le message à afficher. * @param {string} type - Le type de message ('info', 'success', 'error'). */ function updateStatus(message, type = 'info') { statusDisplay.style.display = "block"; statusDisplay.innerHTML = message; statusDisplay.className = 'p-4 rounded-lg text-sm text-center'; resultBox.classList.add('hidden'); switch (type) { case 'success': statusDisplay.classList.add('bg-green-50', 'border', 'border-green-200', 'text-green-800'); break; case 'error': statusDisplay.classList.add('bg-red-50', 'border', 'border-red-200', 'text-red-800'); break; case 'info': default: statusDisplay.classList.add('bg-blue-50', 'border', 'border-blue-200', 'text-blue-800'); break; } } /** * Gère la réussite de la géolocalisation. * @param {GeolocationPosition} position - L'objet de position retourné par l'API. */ function success(position) { locateButton.disabled = false; loadingSpinner.classList.add('hidden'); buttonText.textContent = 'Relancer la Géolocalisation'; const lat = position.coords.latitude.toFixed(6); const lon = position.coords.longitude.toFixed(6); const acc = position.coords.accuracy.toFixed(2); latitudeSpan.textContent = lat; longitudeSpan.textContent = lon; accuracySpan.textContent = `${acc} m`; //updateStatus(`Localisation réussie ! Vos coordonnées sont affichées ci-dessous.`, 'success'); resultBox.classList.remove('hidden'); window.location = "/recherche_gps.php?lat="+lat+"&lon="+lon }/** * Définit l'action de rechargement du bouton après un refus de permission. */ function setReloadButtonAction() { locateButton.setAttribute('onclick', 'window.location.search = \'?get_gps=1\''); } function getDeviceType() { const ua = navigator.userAgent; // 1. Détection Android if (/Android/i.test(ua)) { return "Android"; } // 2. Détection iOS (iPhone, iPod, iPad classique) // 'i' rend la recherche insensible à la casse (maj/min) if (/iPhone|iPad|iPod/i.test(ua)) { return "iOS"; } // 3. Détection iPad OS 13+ (Le Piège !) // Depuis iOS 13, les iPad se déclarent comme des Mac (MacIntel). // On vérifie s'il y a un écran tactile (maxTouchPoints > 1) pour faire la différence. if (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1) { return "iOS"; // C'est un iPad } // 4. Tout le reste est considéré comme PC/Desktop (Mac, Windows, Linux) return "PC"; } /** * Gère l'échec de la géolocalisation. * @param {GeolocationPositionError} error - L'objet d'erreur retourné par l'API. */ function error(err) { locateButton.disabled = false; loadingSpinner.classList.add('hidden'); buttonText.textContent = 'Me Localiser'; let errorMessage = "Erreur inconnue."; let troubleshooting = "Vérifiez que votre connexion Internet est stable."; let devicetype = getDeviceType(); switch (err.code) { case err.PERMISSION_DENIED: setReloadButtonAction(); errorMessage = "Accès refusé (Code 1) : Vous devez autoriser le navigateur à accéder à votre position."; if(devicetype === 'iOS'){ // DÉTECTION SPÉCIFIQUE IOS POUR LE MESSAGE D'AIDE troubleshooting = '

Allez dans Réglages > Confidentialité et sécurité > Service de localisation. Sélectionnez Safari (ou votre navigateur) et cochez "Lorsque l\'app est active".'; }else if (getDeviceType() === 'Android') { // Texte Spécifique Android troubleshooting = '
1. Activez la "Position" (📍) dans le menu rapide du haut.
2. Si cela échoue, vérifiez que Chrome a la permission : Paramètres > Applis > Chrome > Autorisations.'; } else { // Texte par défaut (PC/Mac) troubleshooting = 'Cliquez sur le cadenas 🔒 à gauche de l\'adresse URL et autorisez la localisation, ou vérifiez les préférences de votre navigateur.'; } break; case err.POSITION_UNAVAILABLE: errorMessage = "Position indisponible (Code 2) : Impossible de déterminer votre position."; troubleshooting = "Ceci peut se produire si votre appareil n'a pas de signal GPS ou si vous êtes dans un environnement sans Wi-Fi/données mobiles."; break; case err.TIMEOUT: errorMessage = "Délai expiré (Code 3) : La recherche de position a pris trop de temps."; troubleshooting = "Essayez de vous déplacer vers un endroit avec un meilleur signal ou une meilleure connexion."; break; default: errorMessage = `Erreur : ${err.message}`; troubleshooting = "Veuillez vérifier les points ci-dessus."; break; } updateStatus(`${errorMessage}

Solution : ${troubleshooting}`, 'error'); } /** * Lance le processus de géolocalisation. */ function getGeolocation() { if (!navigator.geolocation) { updateStatus("Votre navigateur ne supporte pas l'API de géolocalisation.", 'error'); return; } // Désactivation du bouton et affichage du spinner locateButton.disabled = true; loadingSpinner.classList.remove('hidden'); //updateStatus("Lancement de la requête de géolocalisation...", 'info'); // Options de la requête de géolocalisation const options = { enableHighAccuracy: true, // Haute précision timeout: 15000, // 15 secondes avant le TIMEOUT maximumAge: 0 // Ne pas utiliser de position mise en cache }; navigator.geolocation.getCurrentPosition(success, error, options); } // Message initial //updateStatus("Bienvenue. Cliquez sur le bouton pour tester votre géolocalisation.");