Skip to content

Custom Button Handlers ​

By default, Driver.js handles button clicks automatically: "Next" moves to the next step, "Previous" goes back, and "Close" destroys the tour. However, you can override this behavior with custom handlers.

Available Button Hooks ​

MethodDefault Behavior (if not overridden)
onNextClick($callback)Move to next step
onPrevClick($callback)Move to previous step
onCloseClick($callback)Destroy the driver

Method Signatures ​

php
DriverJs::onNextClick(string $callback);
DriverJs::onPrevClick(string $callback);
DriverJs::onCloseClick(string $callback);

Parameters ​

  • $callback (string): The name of a JavaScript function or inline JavaScript expression.

Example: Custom Next Click Handler ​

php
use RealRashid\LaravelDriverJs\Facades\DriverJs;

DriverJs::tour('onboarding')
    ->onNextClick('customNextHandler')
    ->step('#header', 'Welcome')
    ->step('#nav', 'Navigation')
    ->render();
javascript
// In your JavaScript
function customNextHandler(element, step, opts) {
    // Perform some custom logic before moving to the next step
    console.log('Moving to next step from:', element);

    // You must manually move to the next step
    opts.driver.moveNext();
}

Example: Async Next Click Handler ​

A powerful pattern is dynamically loading steps based on user interaction:

php
DriverJs::tour('dynamic-tour')
    ->onNextClick('dynamicNextHandler')
    ->step('#header', 'Welcome', 'Let us show you around.')
    ->render();
javascript
// In your JavaScript
async function dynamicNextHandler(element, step, opts) {
    // Fetch new steps from the server
    const response = await fetch('/api/tour/next-steps');
    const steps = await response.json();

    // Update the driver with new steps
    opts.driver.setSteps(steps);
    opts.driver.moveNext();
}

Example: Custom Close Handler ​

php
DriverJs::tour('onboarding')
    ->onCloseClick('customCloseHandler')
    ->step('#header', 'Welcome')
    ->render();
javascript
// In your JavaScript
function customCloseHandler(element, step, opts) {
    // Log analytics before closing
    analytics.track('tour_closed_prematurely', {
        step: opts.state.activeIndex,
        total: opts.config.steps.length
    });

    // Actually destroy the tour
    opts.driver.destroy();
}

Step-Level Button Hooks ​

You can also override button behavior on individual steps using the step builder methods:

php
DriverJs::addStep('#header')
    ->title('Welcome')
    ->description('The main header.')
    ->popoverClass('welcome-step')
    ->onNextClick('welcomeNextHandler')
    ->onPrevClick('welcomePrevHandler')
    ->onCloseClick('welcomeCloseHandler');

If you prefer addSteps(), the equivalent array keys are on_next_click, on_prev_click, on_close_click, and on_popover_render.

Important Notes ​

  • When you override a button click handler, the default behavior is completely replaced. You must manually call the appropriate driver method (e.g., opts.driver.moveNext()) if you still want the default navigation to occur.
  • The callback receives three arguments: element (the DOM element), step (the step configuration), and opts (an object containing config, state, and driver).
  • The opts.driver reference allows you to call any Driver.js method from within your callback.

That's it! You're now equipped to create custom button handlers using Laravel Driver.js.