Naar de hoofdinhoud

Een bsport-widget integreren op Wix

Stapsgewijze handleiding voor het toevoegen van een bsport-widget aan een Wix-site, waarom het Embed HTML-element problemen veroorzaakt en d

Wix biedt twee manieren om een bsport-widget aan je site toe te voegen. Beide werken, maar ze gedragen zich heel verschillend — en de methode die Wix als eerste voorstelt, is degene die achter de meeste problemen zit die studio's melden. Dit artikel leidt je door beide methodes, legt de Wix-beperkingen achter die problemen uit en laat zien hoe je ze kunt vermijden.

Wil je liever dat wij het voor je instellen? De aanbevolen methode (Methode 2) houdt in dat je aangepaste code aan je Wix-site toevoegt. Als je wilt dat wij dit voor je implementeren, neem dan contact op met bsport-support en stuur ons een uitnodiging als medewerker voor je Wix-site (in Wix: Instellingen → Rollen & machtigingen). Wij nemen het dan verder van je over.

Voordat je begint

Genereer je widgetcode in de bsport back office: Instellingen → Widgets, kies het widgettype, stel je opties in en scroll vervolgens naar beneden om de code te kopiëren. Elke keer dat je een instelling wijzigt, wordt er een nieuwe code gegenereerd, en moet je de nieuwe versie op je site plakken om de wijziging door te voeren.

Methode 1 — Embed HTML-element (snel, met beperkingen)

  1. Klik in de Wix Editor op Elementen toevoegen → Code insluiten → HTML insluiten

  2. Sleep het element naar de pagina waar je de widget wilt plaatsen

  3. Klik op Code invoeren en plak je widgetcode

  4. Pas de grootte van het element aan, zowel in de desktop- als in de mobiele weergave, en klik op Publiceren

Wat je moet weten voordat je deze methode kiest: de iframe

Wix plaatst alles wat je toevoegt met het Embed HTML-element automatisch in een iframe — een kader met een vaste grootte dat niet meegroeit met de inhoud. Dit zit zo in de bouw van Wix, en heeft niets met de widget zelf te maken, maar het veroorzaakt vier terugkerende problemen:

  • De widget zit vast in een kader met een vaste grootte. Hij kan niet groter worden dan de grootte die je voor het element hebt ingesteld en kan zich niet aanpassen aan zijn omgeving, ook al is de widget zelf responsief.

  • Scrollen werkt niet goed op mobiel en tablet. Als de inhoud hoger is dan het kader, kunnen bezoekers er vaak niet naartoe scrollen — een swipebeweging binnen een iframe met een vaste hoogte wordt meestal opgepikt door de pagina in plaats van door het kader. Dit is het meest gemelde probleem.

  • Pop-ups en dialoogvensters zitten vast. Een sessiedetail of betaalvenster kan alleen het kader bedekken, niet de hele pagina, waardoor het afgesneden kan lijken.

  • Tracking bereikt je pagina niet. Gebeurtenissen die de widget verstuurt, blijven binnen het kader, waardoor Google Tag Manager of andere analysetools op je Wix-site ze niet zien.

Als je een van deze problemen tegenkomt, raden we aan om Methode 2 te gebruiken.

Agenda op Wix: behoud het Embed HTML-element en los het op

Als je de agenda-widget toevoegt en het Embed HTML-element wilt behouden — bijvoorbeeld zodat je hem nog steeds met slepen en neerzetten kunt plaatsen in de Wix Editor — kun je de twee belangrijkste iframe-problemen oplossen met een paar extra scripts:

  • de agenda wordt afgesneden wanneer de hoogte verandert (bijvoorbeeld bij het wisselen van week)

  • boekings- en beschrijvingspop-ups openen te ver boven of onder het scherm van de bezoeker

Deze optie vereist een gekoppeld domein en een premium Wix-abonnement. Hiermee worden widgetgebeurtenissen niet zichtbaar voor Google Tag Manager — gebruik daarvoor Methode 2.

Methode 2 — Custom Code (aanbevolen)

Hierdoor wordt de widget rechtstreeks in de pagina geplaatst in plaats van in een kader. Hij past zich dan aan zijn natuurlijke hoogte aan, scrollt mee met de pagina, opent dialoogvensters over de hele pagina, en de gebeurtenissen zijn zichtbaar voor je tracking.

Belangrijk: widgets die op deze manier zijn toegevoegd, kunnen niet via slepen en neerzetten worden verplaatst. De widget verschijnt niet als element in de Wix Editor, dus je kunt hem daar niet verslepen of van grootte veranderen. In plaats daarvan wordt de positie in de code ingesteld: je geeft in de code aan in welke sectie van de pagina de widget moet komen (de targetSelector, hieronder uitgelegd). Om de widget later te verplaatsen, wijzig je deze waarde in de code.

Stappen

  1. Ga naar je Wix-dashboard → Instellingen → Custom Code

  2. Klik op Aangepaste code toevoegen

  3. Plak de onderstaande code, nadat je de waarden onder Te vervangen waarden hebt aangepast

  4. Kies onder Code toevoegen aan pagina's voor de specifieke pagina in plaats van alle pagina's

  5. Stel Code plaatsen in in op Body - end

  6. Geef het een naam die je later herkent, klik dan op Toepassen en Publiceren

De code

<script>
(function() {
'use strict';

// ─── SHARED CDN LOADER ───
function loadCDN() {
if (!window._bsportCDNPromise) {
window._bsportCDNPromise = new Promise((resolve) => {
if (window.BsportWidget) return resolve();
if (!document.getElementById('bsport-widget-cdn')) {
const script = document.createElement('script');
script.id = 'bsport-widget-cdn';
script.src = 'https://cdn.bsport.io/scripts/widget.js';
script.onload = resolve;
document.head.appendChild(script);
} else {
const interval = setInterval(() => {
if (window.BsportWidget) { clearInterval(interval); resolve(); }
}, 100);
}
});
}
return window._bsportCDNPromise;
}

// ─── WAIT FOR ELEMENT WITH RETRY ───
function waitForElement(selector, timeout = 15000) {
return new Promise((resolve) => {
// 1. Check immediately
const found = document.querySelector(selector);
if (found) return resolve(found);

// 2. Otherwise observe DOM changes
const observer = new MutationObserver(() => {
const el = document.querySelector(selector);
if (el) {
observer.disconnect();
clearTimeout(timer);
resolve(el);
}
});

observer.observe(document.body, {
childList: true,
subtree: true
});

// 3. Fallback timeout
const timer = setTimeout(() => {
observer.disconnect();
resolve(null);
}, timeout);
});
}

// ─── REUSABLE WIDGET FACTORY ───
function createBsportWidget({ containerId, widgetType, targetSelector, config }) {
let mounted = false;
let mountAttempts = 0;
const maxMountAttempts = 5;

async function addContainer() {
const existing = document.getElementById(containerId);
if (existing) {
return true;
}

const parentContainer = await waitForElement(targetSelector, 15000);
if (!parentContainer) {
return false;
}

const container = document.createElement('div');
container.id = containerId;
parentContainer.appendChild(container);
return true;
}

function mountWidget() {
if (mounted) return;

mountAttempts++;
if (mountAttempts > maxMountAttempts) {
return;
}

loadCDN().then(() => {
const container = document.getElementById(containerId);
if (!container) {
setTimeout(mountWidget, 500);
return;
}

if (typeof window.BsportWidget?.mount !== 'function') {
setTimeout(mountWidget, 500);
return;
}

try {
window.BsportWidget.mount({
parentElement: containerId,
companyId: 1234, // VERVANG door je bedrijfs-ID
franchiseId: null,
dialogMode: 1,
widgetType,
showFab: false,
fullScreenPopup: false,
styles: undefined,
config
});
mounted = true;
} catch (e) {
mounted = false;
setTimeout(mountWidget, 500);
}
});
}

function init() {
async function start() {
const added = await addContainer();
if (added) mountWidget();
}

if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', () => setTimeout(start, 3000));
} else {
start();
}
}

init();
}

// ─── WIDGET INSTANCES ───
createBsportWidget({
containerId: 'bsport-widget-planning', // VERVANG door een naam naar keuze
targetSelector: 'main[id="PAGES_CONTAINER"] section > div:nth-child(2) > div', // VERVANG door de sectie waar de widget moet verschijnen
widgetType: 'calendar', // VERVANG door je widgettype
config: { // VERVANG door de config uit je widgetcode
calendar: {
}
}
});

})();
</script>

Te vervangen waarden

  • companyId — vervang 1234 door je bsport-bedrijfs-ID. Je vindt deze in de widgetcode die in je back office is gegenereerd.

  • containerId — een willekeurige naam voor de container van de widget, bijvoorbeeld bsport-widget-planning. Gebruik een andere naam voor elke widget op dezelfde pagina.

  • widgetType — het type widget dat je wilt tonen, bijvoorbeeld calendar. Kopieer dit van de regel widgetType in je widgetcode uit de back office.

  • targetSelector — waar de widget op de pagina verschijnt. Dit is een CSS-selector die verwijst naar de sectie waarin de widget wordt geplaatst. Om deze te vinden, open je de gepubliceerde pagina in Chrome, klik je met de rechtermuisknop op de sectie waar je de widget wilt, kies je Inspecteren, klik je vervolgens met de rechtermuisknop op het gemarkeerde element en kies je Copy → Copy selector. Dit vervangt slepen en neerzetten: om de widget te verplaatsen, wijzig je deze waarde.

  • config — de opties van de widget. Kopieer het config-object uit je widgetcode in de back office zodat de widget de filters en weergaveopties behoudt die je hebt gekozen.

Om meer dan één widget te tonen, voeg je nog een createBsportWidget({ ... })-blok toe onder WIDGET INSTANCES, met een eigen containerId, targetSelector, widgetType en config.

Als de widget niet verschijnt waar je hem wilt hebben, of als je liever geen code bewerkt, neem dan contact op met bsport-support en wij stellen het voor je in.

De twee methodes vergeleken

Embed HTML-element (slepen en neerzetten)

  • Eenvoudig visueel te positioneren in de Wix-editor

  • Onderhevig aan alle bovengenoemde iframe-beperkingen

  • Prima voor een korte widget met een vaste hoogte op desktop

Custom Code (ingevoegd in de body)

  • Geen iframe — de widget past zich vrij aan en scrollt mee met de pagina

  • Dialoogvensters openen over de hele pagina

  • Trackinggebeurtenissen bereiken je site

  • Geen slepen en neerzetten: de plaatsing wordt in de code ingesteld met targetSelector

De loginknop aan je header toevoegen

De bsport-loginknopwidget kan niet via slepen en neerzetten aan een Wix-header worden toegevoegd: Wix-headers accepteren het Embed HTML-element helemaal niet.

Het kan nog steeds met Methode 2. Door de code van de loginknop via Instellingen → Custom Code in de body van de pagina in te voegen, wordt hij zonder de iframe-wrapper in de header geplaatst. Omdat dit betekent dat de knop via code moet worden gepositioneerd, stellen we dit meestal voor je in — zie Hoe wij kunnen helpen hieronder.

Problemen oplossen

Bezoekers kunnen op mobiel niet door alles scrollen.
Dit is de hierboven beschreven iframe-beperking. Stap over op Methode 2.

Een pop-up opent, maar wordt afgesneden.
De widget zit in een iframe. Stap over op Methode 2 — of raadpleeg voor de agenda-widget Agenda op Wix hierboven.

Google Tag Manager ziet geen widgetgebeurtenissen.
Gebeurtenissen kunnen de iframe niet verlaten. Stap over op Methode 2.

De widget verschijnt niet met Methode 2.
Controleer of targetSelector verwijst naar een sectie die op die pagina bestaat, of de bedrijfs-ID klopt, en of de code is toegewezen aan de juiste pagina onder Code toevoegen aan pagina's.

Wijzigingen die in de back office zijn gemaakt, worden niet weergegeven.
De configuratie wordt niet automatisch bijgewerkt op je site. Kopieer de nieuw gegenereerde code en vervang de oude volledig. Werk bij Methode 2 in plaats daarvan de waarden van widgetType en config bij in je aangepaste code.

De widget ziet er anders uit dan in de voorvertoning in de back office, of reageert niet op klikken.
Schakel Compatibiliteitsmodus in je widgetinstellingen in, en kopieer en plak dan de nieuwe code.

Er verschijnt helemaal niets.
Controleer of de widget niet twee keer is toegevoegd — zowel via een Embed-element als via Custom Code. Twee exemplaren op één pagina zullen botsen.

De lay-out oogt krap.
De widget is responsief, maar heeft ruimte nodig. Zorg dat de sectie die hem bevat breed genoeg is, en controleer de mobiele weergave apart in de Wix-editor.

Hoe wij kunnen helpen

Overstappen naar de Custom Code-methode betekent dat er wijzigingen in je Wix-site worden aangebracht: code toevoegen of bewerken onder Instellingen → Custom Code, en soms het aanpassen van de lay-out of opmaak van de pagina. Als je liever hebt dat wij dit regelen, helpen we je graag met:

  • Een bestaande widget uit de iframe halen om scroll- en pop-upproblemen op te lossen

  • De loginknop via Custom Code aan je header toevoegen

  • De grootte, plaatsing en overflow van de widget aanpassen

  • Je webontwikkelaar begeleiden bij de implementatie

Hiervoor hebben we een uitnodiging als medewerker voor je Wix-site nodig (in Wix: Instellingen → Rollen & machtigingen). Neem contact op met ons supportteam en wij nemen het dan verder van je over.

Kom je er niet uit? Neem contact op met ons supportteam met de pagina-URL en een screenshot, en wij kijken ernaar.

Was dit een antwoord op uw vraag?