I am using Intro.js for a guided tour.
I would like to fire javascript functions between some of the steps but I don't manage to.
An idea would be to define different intros, and fire the javascript functions between the intros.
Is there a cleaner way to do it ?
I think I found a better solution, by setting a callback on step changes :
introJs().onchange(function(targetElement) {
console.log(targetElement.id);
switch (targetElement.id)
{
case "step1":
function1();
break;
case "step2":
function2();
break;
}
}).start();
Another solution would be to alter it's step events in a more generic way:
//setup your guide object and steps, with the addition of
//event attributes per step that match the guide objects
//available callbacks (onchange, onbeforechange, etc.)
var guide = introJS();
var options = {
steps:[
{
element: '#step1',
intro: 'Your content...',
position: 'top',
onchange: function(){
//do something interesting here...
},
onbeforechange: function(){
//do something else interesting here...
}
},{
element: '#step2',
intro: 'Your content...',
position: 'top',
onchange: function(){
//do something interesting here...
},
onbeforechange: function(){
//do something else interesting here...
}
}
]
};
createStepEvents: function( guideObject, eventList ){
//underscore loop used here, foreach would work just as well
_.each( eventList, function( event ){
//for the guid object's <event> attribute...
guideObject[event]( function(){
//get its steps and current step value
var steps = this._options.steps,
currentStep = this._currentStep;
//if it's a function, execute the specified <event> type
if( _.isFunction(steps[currentStep][event]) ){
steps[currentStep][event]();
}
});
}, this );
}
//setup the events per step you care about for this guide
createStepEvents( guide, ['onchange','onbeforechange']);
This way you can specify which events happen on the description object of the step, rather than disconnecting events and their associated events.
this._currentStep is better.
introJs().onchange(function(targetElement) {
console.log(this._currentStep);
}).start();
Javascript:
var options_before = {
steps: [
{
element: '#step1',
intro: 'Step One'
},
{
element: '#step2',
intro: "Step Two"
},
{
element: '#step3',
intro: "Final Step"
}
]
};
function startObjectsIntro() {
var intro = introJs();
intro.setOptions(options_before);
intro.start().onbeforechange(function () {
if (intro._currentStep == "2") {
alert("This is step 2")
}
});
}
html:
<div id="step1">
Step 1
</div>
<div id="step2">
Step 2
</div>
<div id="step3">
Step 3
</div>
<hr />
<a onclick="startObjectsIntro();">Start intro</a>
https://jsfiddle.net/jmfr8nyj/8/