Custom Widget Triggers: How to Open a Widget from a Custom Page Button
This guide explains how to trigger a Flametree chat widget from a custom page button using JavaScript. The widget is assumed to be embedded in the HTML of the page and is identified by a specific id (e.g., chat-widget). The goal is to simulate a click event on a specific button within the widget when a user clicks a custom button or link on the page.
Prerequisites
- Flametree widget is embedded in the page with a known id (e.g., chat-widget)
- A custom button or link on the page that should trigger the widget
- Basic understanding of JavaScript and DOM manipulation
- Access to website's JavaScript/HTML editing capabilities
Requirements
- Flametree widget is embedded in the page with a known id (e.g., chat-widget)
- A custom button or link on the page that should trigger the widget
Implementation Process
Step 1: Identify the Widget Element
The widget is embedded in the page using an id attribute. For example:
<div id="chat-widget">
<!-- widget content -->
</div>
Step 2: Locate the Button Within the Widget
To trigger the widget, we need to locate and simulate a click on the last button in the widget. This is often the "Open" or "Start Chat" button.
const widget = document.getElementById('chat-widget');
const buttons = widget.querySelectorAll('button[type=button]');
const lastButton = buttons[buttons.length - 1];
lastButton?.click();
Step 3: Add a Click Listener to the Custom Button
We can attach a click event listener to a specific button or link on the page. This is often done using document.querySelectorAll()
to find the element and then attaching the event listener.
const links = document.querySelectorAll('a');
links.forEach(link => {
if (link.textContent.trim().toLowerCase().includes('schedule a call')) {
link.addEventListener('click', function (e) {
e.preventDefault();
// Trigger widget
});
}
});
Step 4: Trigger the Widget
Inside the event listener, we find the widget and simulate a click on the last button:
try {
const widget = document.getElementById('chat-widget');
const buttons = widget.querySelectorAll('button[type=button]');
const lastButton = buttons[buttons.length - 1];
lastButton?.click();
} catch (err) {
console.error('Failed to open chat widget:', err);
}
Complete Implementation Example
Here's the full JavaScript code that combines all the steps:
<script>
window.addEventListener('DOMContentLoaded', function () {
const links = document.querySelectorAll('a');
links.forEach(link => {
if (link.textContent.trim().toLowerCase().includes('schedule a call')) {
link.addEventListener('click', function (e) {
e.preventDefault();
try {
const widget = document.getElementById('chat-widget');
const buttons = widget.querySelectorAll('button[type=button]');
const lastButton = buttons[buttons.length - 1];
lastButton?.click();
} catch (err) {
console.error('Failed to open chat widget:', err);
}
});
}
});
});
</script>
Advanced Customizations
Targeting Specific Buttons
Instead of using the last button, you can target specific buttons by their attributes:
// Find button by specific text content
const openButton = widget.querySelector('button[title="Open Chat"]');
// Find button by class name
const chatButton = widget.querySelector('button.chat-open-btn');
// Find button by data attribute
const triggerButton = widget.querySelector('button[data-action="open-chat"]');
Multiple Trigger Elements
You can set up multiple elements to trigger the widget:
// Target multiple elements by class
const triggerElements = document.querySelectorAll('.open-chat-trigger');
triggerElements.forEach(element => {
element.addEventListener('click', function(e) {
e.preventDefault();
openChatWidget();
});
});
// Reusable function to open widget
function openChatWidget() {
try {
const widget = document.getElementById('chat-widget');
const buttons = widget.querySelectorAll('button[type=button]');
const lastButton = buttons[buttons.length - 1];
lastButton?.click();
} catch (err) {
console.error('Failed to open chat widget:', err);
}
}
Conditional Widget Opening
Open the widget based on specific conditions:
function openChatIfAvailable() {
// Check if widget is loaded and agent is online
const widget = document.getElementById('chat-widget');
if (!widget) {
console.warn('Chat widget not found');
return;
}
// Check if widget indicates agent is available
const statusIndicator = widget.querySelector('.agent-status');
if (statusIndicator && statusIndicator.textContent.includes('offline')) {
alert('Chat agent is currently offline. Please try again later.');
return;
}
// Proceed to open widget
const buttons = widget.querySelectorAll('button[type=button]');
const lastButton = buttons[buttons.length - 1];
lastButton?.click();
}
Implementation Notes
Important Considerations
• e.preventDefault();
is used to prevent the default link behavior (e.g., navigating to a new page)
• lastButton?.click();
ensures that the click is only triggered if the button exists (optional chaining)
• Error handling is added using a try...catch block to log any issues that may occur during widget triggering
Browser Compatibility
This solution works in all modern browsers that support:
document.getElementById()
querySelectorAll()
addEventListener()
- Optional chaining (
?.
) - for older browsers, use regular null checks