JavaScript API
XBuilder exposes a JavaScript API for programmatic control of popups. Use this API to integrate popups with your site's logic, custom triggers, and analytics.
Runtime Overview
When XBuilder popups are deployed, they include a runtime script that:
- Initializes popup configurations
- Handles triggers and display logic
- Provides API methods for control
- Manages cookies and display rules
Accessing the API
The API is available on the window object:
// Check if XBuilder is loaded
if (window.XBuilder) {
// API is available
}
Core Methods
Opening Popups
XBuilder.open(popupId)
Opens a specific popup by ID.
XBuilder.open('popup-123456789');
Parameters:
| Name | Type | Description |
|---|---|---|
popupId | string | The popup's unique ID |
Returns: void
XBuilder.openAll()
Opens all popups on the page.
XBuilder.openAll();
Closing Popups
XBuilder.close(popupId)
Closes a specific popup.
XBuilder.close('popup-123456789');
Parameters:
| Name | Type | Description |
|---|---|---|
popupId | string | The popup's unique ID |
Returns: void
XBuilder.closeAll()
Closes all open popups.
XBuilder.closeAll();
Toggle
XBuilder.toggle(popupId)
Toggles a popup open/closed.
XBuilder.toggle('popup-123456789');
State Methods
XBuilder.isOpen(popupId)
Check if a popup is currently open.
const isOpen = XBuilder.isOpen('popup-123456789');
// Returns: true or false
XBuilder.getPopups()
Get list of all popup IDs on the page.
const popups = XBuilder.getPopups();
// Returns: ['popup-123', 'popup-456', ...]
XBuilder.getConfig(popupId)
Get the configuration of a popup.
const config = XBuilder.getConfig('popup-123456789');
// Returns: PopupConfig object
Event Handling
Event Types
| Event | Description |
|---|---|
xbuilder:open | Fired when popup opens |
xbuilder:close | Fired when popup closes |
xbuilder:ready | Fired when XBuilder initializes |
Listening to Events
// Popup opened
document.addEventListener('xbuilder:open', (e) => {
console.log('Popup opened:', e.detail.popupId);
});
// Popup closed
document.addEventListener('xbuilder:close', (e) => {
console.log('Popup closed:', e.detail.popupId);
});
// XBuilder ready
document.addEventListener('xbuilder:ready', () => {
console.log('XBuilder initialized');
});
Event Detail
Events include detail about the popup:
document.addEventListener('xbuilder:open', (e) => {
const { popupId, trigger, timestamp } = e.detail;
console.log(`Popup ${popupId} opened via ${trigger}`);
});
Cookie Management
XBuilder.resetCookie(popupId)
Reset the display cookie for a popup.
XBuilder.resetCookie('popup-123456789');
// Popup will show again on next trigger
XBuilder.resetAllCookies()
Reset cookies for all popups.
XBuilder.resetAllCookies();
Custom Triggers
Click Triggers
Set up custom click triggers:
document.querySelector('#my-button').addEventListener('click', () => {
XBuilder.open('popup-123456789');
});
Conditional Opening
Open based on conditions:
// Open for logged-in users only
if (userIsLoggedIn) {
XBuilder.open('popup-members-only');
}
// Open based on cart value
if (cartTotal > 100) {
XBuilder.open('popup-free-shipping');
}
Custom Scroll Trigger
window.addEventListener('scroll', () => {
const scrollPercent = (window.scrollY / document.body.scrollHeight) * 100;
if (scrollPercent > 75 && !hasShownPopup) {
XBuilder.open('popup-end-of-page');
hasShownPopup = true;
}
});
Analytics Integration
Google Analytics
document.addEventListener('xbuilder:open', (e) => {
gtag('event', 'popup_view', {
'popup_id': e.detail.popupId,
'trigger': e.detail.trigger
});
});
document.addEventListener('xbuilder:close', (e) => {
gtag('event', 'popup_close', {
'popup_id': e.detail.popupId
});
});
Generic Analytics
document.addEventListener('xbuilder:open', (e) => {
analytics.track('Popup Viewed', {
popupId: e.detail.popupId,
trigger: e.detail.trigger
});
});
Form Integration
Track Form Submissions
// For popups with forms
document.addEventListener('submit', (e) => {
if (e.target.closest('.xb-popup-module')) {
const popupId = e.target.closest('[data-popup-id]')?.dataset.popupId;
analytics.track('Popup Form Submit', { popupId });
}
});
Close After Submit
// Close popup after successful form submission
form.addEventListener('submit', async (e) => {
e.preventDefault();
const response = await submitForm(form);
if (response.success) {
XBuilder.close('popup-123456789');
}
});
A/B Testing
Show Different Popups
// Simple A/B test
const variant = Math.random() > 0.5 ? 'A' : 'B';
if (variant === 'A') {
XBuilder.open('popup-variant-a');
} else {
XBuilder.open('popup-variant-b');
}
// Track which variant
analytics.track('Popup AB Test', { variant });
Error Handling
Check for Errors
try {
XBuilder.open('popup-123456789');
} catch (error) {
console.error('Failed to open popup:', error);
}
Verify Popup Exists
const popups = XBuilder.getPopups();
if (popups.includes('popup-123456789')) {
XBuilder.open('popup-123456789');
} else {
console.warn('Popup not found');
}
Initialization
Wait for XBuilder
// Method 1: Event listener
document.addEventListener('xbuilder:ready', () => {
// XBuilder is ready
XBuilder.open('popup-welcome');
});
// Method 2: Polling
function waitForXBuilder(callback) {
if (window.XBuilder) {
callback();
} else {
setTimeout(() => waitForXBuilder(callback), 100);
}
}
waitForXBuilder(() => {
console.log('XBuilder loaded');
});
Best Practices
Performance
// Don't open too many popups at once
// XBuilder handles this, but be careful with custom logic
// Bad
XBuilder.openAll(); // Opens everything
// Good
XBuilder.open('popup-primary'); // Open one at a time
User Experience
// Respect user dismissal
document.addEventListener('xbuilder:close', (e) => {
if (e.detail.closedByUser) {
// User explicitly closed, maybe don't show again soon
localStorage.setItem('popup-dismissed', Date.now());
}
});
Debugging
// Enable debug mode
XBuilder.debug = true;
// This will log internal operations to console
TypeScript Types
For TypeScript projects:
interface XBuilderAPI {
open(popupId: string): void;
close(popupId: string): void;
closeAll(): void;
toggle(popupId: string): void;
isOpen(popupId: string): boolean;
getPopups(): string[];
getConfig(popupId: string): PopupConfig;
resetCookie(popupId: string): void;
resetAllCookies(): void;
}
declare global {
interface Window {
XBuilder: XBuilderAPI;
}
}