2013-06-17 12 views
10

Ich verwende Intro.js für eine geführte Tour.Firing JavaScript-Funktion zwischen intro.js Schritten

Ich möchte JavaScript-Funktionen zwischen einigen der Schritte auslösen, aber ich schaffe es nicht. Eine Idee wäre, verschiedene Intros zu definieren und die JavaScript-Funktionen zwischen den Intros zu feuern.

Gibt es einen saubereren Weg, es zu tun?

Antwort

21

Ich glaube, ich eine bessere Lösung gefunden, durch einen Rückruf auf Schritt ändert sich die Einstellung:

introJs().onchange(function(targetElement) { 
console.log(targetElement.id); 
    switch (targetElement.id) 
     { 
     case "step1": 
      function1(); 
     break; 
     case "step2": 
      function2(); 
     break; 
     } 
}).start(); 
+0

Warum das so viele Stimmen hat? Wie möglich ist es, dass die Zielelement-ID step1 ist – jidexl21

+0

Nein: TypeError: b ist null – Sveen

13

Eine andere Lösung wäre es Ereignisse Schritt in einer allgemeinere Art und Weise zu verändern:

//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']);

Auf diese Weise können Sie angeben, welche Ereignisse auf dem DESC auftreten Objekt des Schritts, anstatt Ereignisse und ihre zugehörigen Ereignisse zu trennen.

7

this._currentStep ist besser.

introJs().onchange(function(targetElement) { 
console.log(this._currentStep); 
}).start(); 
3

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/