Découvrez notre magazine 2026

Boucles d'oreilles

document.addEventListener('DOMContentLoaded', function() { makeCollapsible(); // Gestion des popups Elementor (lorsqu'elles s'ouvrent) jQuery(document).on('elementor/popup/show', function(event, id, instance) { if (id) { makeCollapsible(); } }); // Nettoyage des filtres vides et inutiles cleanFilters(); }); // Écouteur d'événement alternatif pour les popups Elementor window.addEventListener('elementor/popup/show', function(event, id, instance) { if (id) { makeCollapsible(); } }); /** * Fonction pour rendre les filtres pliables/dépliables */ function makeCollapsible() { jQuery(function($) { // Pour les checkboxes - masque les listes de cases à cocher non-appliquées avec animation $('.jet-checkboxes-list:not(.collapsible-applied)').slice(0).slideUp( 500, function() { $(this).addClass('collapsible-applied'); } ); // Pour le filtre range - masque les curseurs de plage non-appliqués avec animation $('.jet-range:not(.collapsible-applied)').slice(0).slideUp( 500, function() { $(this).addClass('collapsible-applied'); } ); // Gestionnaire de clic sur les labels de filtre $('.jet-filter-label').off('click').on('click', function(e) { e.stopPropagation(); // Empêche la propagation de l'événement var $clickedLabel = $(this); var $nextElement = $clickedLabel.next(); // Ferme tous les autres filtres ouverts $('.jet-filter-label').not($clickedLabel).each(function() { var $otherLabel = $(this); var $otherContent = $otherLabel.next(); if ($otherContent.is(':visible')) { $otherContent.slideUp(); $otherLabel.removeClass('noicon'); } }); // Bascule l'état du filtre cliqué (ouvert/fermé) $nextElement.slideToggle(); $clickedLabel.toggleClass('noicon'); }); // Ferme les filtres lorsqu'on clique en dehors $(document).on('click', function(e) { if (!$(e.target).closest('.jet-filter').length) { $('.jet-checkboxes-list:visible, .jet-range:visible').slideUp(); $('.jet-filter-label.noicon').removeClass('noicon'); } }); }); } /** * Fonction pour supprimer les filtres vides et inutiles * Utilise jQuery pour s'assurer de la compatibilité et de la précision */ function cleanFilters() { jQuery(function($) { // Logs pour le débogage console.log('Début du nettoyage des filtres'); // Traiter chaque filtre dans le groupe de filtres $('.jet-filters-group .jet-filter').each(function() { var $filter = $(this); var $label = $filter.find('.jet-filter-label'); var filterName = $label.text().trim(); // Cas 1: Filtre qui n'a qu'un label (sans contenu) if ($filter.children().length === 1 && $filter.children().first().hasClass('jet-filter-label')) { console.log('Suppression du filtre vide:', filterName); $filter.remove(); return; // Passe au filtre suivant } // Cas 2: Filtres avec une seule option ou options déjà sélectionnées sans alternatives var $visibleRows = $filter.find('.jet-checkboxes-list__row:not(.jet-filter-row-hide)'); var $checkedInputs = $filter.find('.jet-checkboxes-list__input:checked'); var $uncheckableRows = $filter.find('.jet-checkboxes-list__row:not(.jet-filter-row-hide):not(:has(.jet-checkboxes-list__input:checked))'); // Si nous avons exactement une option cochée et aucune autre option visible non cochée if ($checkedInputs.length === 1 && $uncheckableRows.length === 0) { console.log('Suppression du filtre avec une seule option cochée:', filterName); $filter.remove(); return; } // Si nous avons exactement une option visible au total if ($visibleRows.length === 1) { console.log('Suppression du filtre avec une seule option visible:', filterName); $filter.remove(); return; } }); console.log('Fin du nettoyage des filtres'); }); // Observer les changements dans le DOM pour détecter de nouveaux filtres setupMutationObserver(); } /** * Configure un observateur de mutations pour détecter les nouveaux filtres * ajoutés au DOM après le chargement initial */ function setupMutationObserver() { jQuery(function($) { // Fonction pour nettoyer à nouveau les filtres const reCheckFilters = function() { $('.jet-filters-group .jet-filter').each(function() { var $filter = $(this); // Cas 1: Filtre qui n'a qu'un label (sans contenu) if ($filter.children().length === 1 && $filter.children().first().hasClass('jet-filter-label')) { $filter.remove(); return; } // Cas 2: Filtres avec une seule option ou options déjà sélectionnées sans alternatives var $visibleRows = $filter.find('.jet-checkboxes-list__row:not(.jet-filter-row-hide)'); var $checkedInputs = $filter.find('.jet-checkboxes-list__input:checked'); var $uncheckableRows = $filter.find('.jet-checkboxes-list__row:not(.jet-filter-row-hide):not(:has(.jet-checkboxes-list__input:checked))'); // Si nous avons exactement une option cochée et aucune autre option visible non cochée if ($checkedInputs.length === 1 && $uncheckableRows.length === 0) { $filter.remove(); return; } // Si nous avons exactement une option visible au total if ($visibleRows.length === 1) { $filter.remove(); return; } }); }; // Créer un observateur MutationObserver if (window.MutationObserver) { const observer = new MutationObserver(function(mutations) { let shouldRecheckFilters = false; mutations.forEach(function(mutation) { if (mutation.addedNodes.length > 0) { for (let i = 0; i < mutation.addedNodes.length; i++) { const node = mutation.addedNodes[i]; if (node.nodeType === 1 && ( (node.classList && (node.classList.contains('jet-filter') || node.classList.contains('jet-filters-group'))) || $(node).find('.jet-filter, .jet-filters-group').length )) { shouldRecheckFilters = true; break; } } } }); if (shouldRecheckFilters) { // Attendre un court instant pour que tous les filtres soient correctement rendus setTimeout(reCheckFilters, 150); } }); // Configurer l'observer observer.observe(document.body, { childList: true, subtree: true }); } }); }
Filtrer par
Catégories
Genre
Genre
Métal
Métal
Disponibilité
Disponibilité
Prix
Prix - slider
Prix - inputs

395

En stock

490

En stock

345

En stock

290

En stock

225

En stock

390

En stock

1 980

En stock

3 850

En stock

340

En stock

340

En stock

2 250

En stock

2 390

En stock

2 340

En stock

590

En stock

3 150

En stock

530

En stock

490

En stock

590

En stock

2 530

En stock

2 680

En stock

210

En stock

290

En stock

5 200

En stock

1 620

En stock

1 100

En stock

1 660

En stock

3 240

En stock

600

En stock

Paiement sécurisé

Vos paiements sont effectués en toute sécurité, pour une expérience d’achat simple et sereine.

Satisfait ou remboursé

Parce que votre satisfaction nous tient à cœur, vous disposez de 14 jours pour retourner votre commande en toute simplicité.

Authenticité garantie

Chaque création est soigneusement sélectionnée pour son authenticité, son origine et la qualité de son savoir-faire.

Expédition sous 72h

Vos commandes sont préparées avec soin et expédiées sous 72h.

Rechercher