Votre panier est actuellement vide.

Retour à la boutique

// ======================== // BC - Mega-menu Basses (mobile) : merge colonnes (SANS IDs) // - Custom Megamenu 2 & 3 -> injecté dans BASSES ÉLECTRIQUES // - Dans Custom Megamenu 4 : BASSES ACOUSTIQUES + BASSES UKULÉLÉS -> remontés au niveau de BASSES ÉLECTRIQUES // - “Nous rachetons votre basse” -> toujours dernier // ======================== (function () { "use strict"; const MOBILE_MAX = 991; function norm(s) { return (s || "") .replace(/\s+/g, " ") .trim() .toLowerCase(); } function getLabelFromLi(li) { if (!li) return ""; // EmallShop: parfois
...
, parfois direct const a = li.querySelector(":scope > .emallshop-megamenu-title a") || li.querySelector(":scope > a") || li.querySelector(":scope > div > a") || li.querySelector("a"); return a ? a.textContent : ""; } function getHrefFromLi(li) { const a = li.querySelector(":scope > .emallshop-megamenu-title a") || li.querySelector(":scope > a") || li.querySelector(":scope > div > a") || li.querySelector("a"); return a ? (a.getAttribute("href") || "") : ""; } function findBassRootLi(mobileMenu) { // On repère l’entrée "Basses" par libellé OU par URL catégorie const lis = mobileMenu.querySelectorAll("li"); for (const li of lis) { const label = norm(getLabelFromLi(li)); const href = getHrefFromLi(li); if (label === "basses" || /\/categorie-produit\/basses\/?/i.test(href)) { // doit avoir un sous-menu en mobile const sub = li.querySelector(":scope > ul.sub-menu"); if (sub) return li; } } return null; } function findElectricLi(bassRootSub) { const direct = bassRootSub.querySelectorAll(":scope > li"); for (const li of direct) { const label = norm(getLabelFromLi(li)); const href = getHrefFromLi(li); if ( label.includes("basses électriques") || /\/basses-electriques\/?/i.test(href) ) { return li; } } return null; } function findCustomMegaLi(bassRootSub, number) { const re = new RegExp("^custom megamenu\\s*" + number + "\\b", "i"); const direct = bassRootSub.querySelectorAll(":scope > li"); for (const li of direct) { const label = getLabelFromLi(li); if (re.test(label.trim())) return li; } return null; } function findBuybackLi(bassRootSub) { const direct = bassRootSub.querySelectorAll(":scope > li"); for (const li of direct) { const label = norm(getLabelFromLi(li)); const href = getHrefFromLi(li); if ( label.includes("nous rachetons votre basse") || /\/vendre-votre-instrument\/?/i.test(href) ) { return li; } } // parfois c’est plus profond const all = bassRootSub.querySelectorAll("li"); for (const li of all) { const label = norm(getLabelFromLi(li)); const href = getHrefFromLi(li); if ( label.includes("nous rachetons votre basse") || /\/vendre-votre-instrument\/?/i.test(href) ) { return li; } } return null; } function moveAllChildren(fromUl, toUl) { if (!fromUl || !toUl) return; while (fromUl.firstElementChild) { const node = fromUl.firstElementChild; // marqueur pour éviter de retraiter si re-run node.dataset.bcMoved = "1"; toUl.appendChild(node); } } function extractAcousticAndUkeLis(custom4Li) { // Dans Custom Megamenu 4, on veut récupérer les 2 LI : // - celui dont le lien contient "BASSES ACOUSTIQUES" ou href /basses-acoustiques/ // - celui dont le lien contient "BASSES UKULÉLÉS" ou href /basses-ukuleles/ const out = { acoustic: null, uke: null }; if (!custom4Li) return out; const sub = custom4Li.querySelector(":scope > ul.sub-menu"); if (!sub) return out; const direct = sub.querySelectorAll(":scope > li"); for (const li of direct) { const label = norm(getLabelFromLi(li)); const href = getHrefFromLi(li); if (!out.acoustic && (label.includes("basses acoustiques") || /\/basses-acoustiques\/?/i.test(href))) { out.acoustic = li; } else if (!out.uke && (label.includes("basses ukul") || /\/basses-ukuleles\/?/i.test(href))) { out.uke = li; } } return out; } function mergeMobileBassMenu() { if (window.innerWidth > MOBILE_MAX) return; const mobileMenu = document.querySelector(".mobile-primary-menu"); if (!mobileMenu) return; const bassRootLi = findBassRootLi(mobileMenu); if (!bassRootLi) return; const bassRootSub = bassRootLi.querySelector(":scope > ul.sub-menu"); if (!bassRootSub) return; // Idempotence : si déjà mergé sur CETTE instance de DOM if (bassRootLi.dataset.bcMerged === "1") return; const electricLi = findElectricLi(bassRootSub); if (!electricLi) return; const electricSub = electricLi.querySelector(":scope > ul.sub-menu"); if (!electricSub) return; // 1) Custom Megamenu 2 & 3 -> injectés dans BASSES ÉLECTRIQUES [2, 3].forEach((n) => { const customLi = findCustomMegaLi(bassRootSub, n); if (!customLi) return; const sub = customLi.querySelector(":scope > ul.sub-menu"); if (sub) moveAllChildren(sub, electricSub); customLi.remove(); }); // 2) Custom Megamenu 4 : remonter Acoustiques & Ukulélés au niveau racine "Basses" const custom4 = findCustomMegaLi(bassRootSub, 4); if (custom4) { const { acoustic, uke } = extractAcousticAndUkeLis(custom4); // On place juste après BASSES ÉLECTRIQUES (ordre logique) const refNode = electricLi.nextSibling; if (acoustic) { acoustic.dataset.bcMoved = "1"; bassRootSub.insertBefore(acoustic, refNode); } if (uke) { uke.dataset.bcMoved = "1"; bassRootSub.insertBefore(uke, refNode); } custom4.remove(); } // 3) “Nous rachetons votre basse” en dernier const buyback = findBuybackLi(bassRootSub); if (buyback) { bassRootSub.appendChild(buyback); } bassRootLi.dataset.bcMerged = "1"; } // Déclenchement robuste : DOMContentLoaded + Observer (menu injecté au clic burger) + resize debounced function debounce(fn, wait) { let t; return function () { clearTimeout(t); t = setTimeout(fn, wait); }; } const run = debounce(mergeMobileBassMenu, 80); document.addEventListener("DOMContentLoaded", run); window.addEventListener("resize", run); // Observer : utile si le menu mobile est reconstruit dynamiquement const obs = new MutationObserver(run); obs.observe(document.documentElement, { childList: true, subtree: true }); })(); jQuery(function($){ setTimeout(function(){ $(".woocommerce-product-search .search-field").each(function(){ var ac = $(this).data("autocomplete"); if (ac) { ac.options.deferRequestBy = 400; } }); }, 800); });