Verwenden Sie intro.js für das Bootstrap-Dropdown-Element

Lesezeit: 4 Minuten

Benutzer-Avatar
Alexandre Melard

Ich kann nicht herausfinden, wie man intro.js für Dropdown-Elemente verwendet.

Ich habe dort eine ähnliche Frage ohne Antwort gefunden: IntroJS Bootstrap Menu doest work

Wenn Sie den Fehler reproduzieren möchten, gehen Sie folgendermaßen vor:

http://recherche.utilitaire.melard.fr/#/carto

Sie müssen auf “Hilfe” klicken (Der grüne Knopf oben rechts), das Problem tritt für den zweiten Schritt auf. Beim Änderungsereignis mache ich Folgendes:

$scope.ChangeEvent = function (e) { 
    if (e.id === 'step2') {
        document.getElementById('step1').click();
    } 
    console.log("Change Event called"); 
};

Beim Debuggen funktioniert alles wie am Schnürchen, bis diese Funktion endet: _showElement Danach verliere ich mich in JQuery-Ereignissen und das Dropdown-Menü wird geschlossen …

Wenn Sie reproduzieren möchten, fügen Sie einfach einen Haltepunkt am Ende der _showElement-Funktion hinzu und Sie werden verstehen, was ich meine …

  • Könnten Sie Ihre Problemumgehung allgemein ein wenig beschreiben? Ich habe das gleiche Problem, aber ich verstehe deine Problemumgehung nicht.

    – Jan Blah

    10. April 2014 um 15:32 Uhr

  • Ihr 2. Link ist defekt.

    – idmein

    7. September 2014 um 16:46 Uhr

  • ok, danke für den Hinweis, ist korrigiert

    – Alexandre Melard

    8. September 2014 um 12:25 Uhr

  • Vielleicht hat sich Ihr Code geändert, seit Sie dies ursprünglich gepostet haben, aber wenn ich lade recherche.utilitaire.melard.fr/#/cartosehe ich viele JS-Fehler in der Konsole.

    – Palpatim

    8. September 2014 um 14:47 Uhr

  • Die Problemumgehung scheint ein Hack zu sein. Es scheint sich zu ändern display:none zu display: block nach 500ms.

    – bhantol

    8. September 2014 um 19:35 Uhr

Benutzer-Avatar
dseminara

Hier eine klarere Lösung

 function startIntro(){
    var intro = introJs();
      intro.setOptions({
        steps: [
          {
            element: "#mydropdown",
            intro: "This is a dropdown"
          },
          {
            element: '#mydropdownoption',
            intro: "This is an option within a dropdown.",
            position: 'bottom'
          },

        ]
      });

      intro.onbeforechange(function(element) {
        if (this._currentStep === 1) {
          setTimeout(function() {
            $("#mydropdown").addClass("open");
          });
        }
      });
      intro.start();
  };

  $(document).ready(function() {
    setTimeout(startIntro,1500);
  });

Beachten Sie, dass setTimeout ohne zweites Argument (Millisekunden) es Ihnen ermöglicht, die Funktion in der Ereignisschleife in die Warteschlange zu stellen und sie auszuführen, nachdem alle Ereignisse verarbeitet wurden (einschließlich des Klicks, der die Dropdown-Liste schließt). Außerdem ist es besser, die Klasse open zur Dropdown-Liste hinzuzufügen, wenn Sie möchten es in den offenen Zustand versetzen

  • Die Anwendung von OP basiert auf AngularJS. Ihre Lösung ist nicht “Angular Way” und eher “jQueriesh”. Sein Problem ist sehr einfach.

    – bhantol

    13. September 2014 um 19:05 Uhr

  • Ich stimme bhantol zu, nicht ganz eine eckige JS-Lösung

    – Alexandre Melard

    17. September 2014 um 9:19 Uhr

  • Für alle, die Bootstrap Version > 4.0 verwenden oder dies im Jahr 2018 lesen, scheint das Hinzufügen der Klasse “open” nicht mehr zu funktionieren, aber es gibt jetzt die jquery-Methode: $('#mydropdown').dropdown('toggle'); um es zu öffnen und zu schließen: getbootstrap.com/docs/4.0/components/dropdowns/#methods

    – Fritz

    4. Juni 2018 um 9:23 Uhr


In Ihrer Vorlage dh in

/views/nav/body-create.html

Sie haben einen Code, bei dem ng-disabled auf !currentPath.name basiert. Und der Wert von currentPath.name ist null. Versuchen Sie, den Wert des folgenden Elements zu überprüfen. Sie werden sehen, dass es null ist.

<button class="dropdown-toggle btn btn-sm btn-default no-radius" ng-disabled="!currentPath.name">
                Niveau{{currentPath.level?": "+currentPath.level:""}} <strong><b class="caret"></b>
                                                          </strong>
</button>

Stellen Sie sicher, dass Sie den richtigen Namen haben oder verwenden Sie eine andere Bedingung – ich bin mir nicht sicher, was Sie mit der Bedingung machen wollen.

Beweis: Untersuchen Sie das obige Element in Ihrem Chrome-Debugger recherche.utilitaire.melard.fr/#/carto Verknüpfung. Geben Sie Folgendes in die Konsole ein und drücken Sie die Eingabetaste.

$scope.currentPath.name="Hello You";

Und Ihr “Niveau”-Menü beginnt zu funktionieren.

Ich habe eine Problemumgehung gefunden, es ist ziemlich hässlich, aber macht den Job:

$scope.ChangeEvent = function (e) { 
    if (e.id === 'step2') {
        document.getElementById('step1').click();
        setTimeout(function () {
            document.getElementById('step2').style.display = 'block';
        }, 500);
    } 
    console.log("Change Event called"); 
};

Ich habe das Anzeigeattribut so eingestellt, dass es direkt nach dem Klickereignis, das ich im Änderungsereignis hinzugefügt habe, blockiert wird

Beim Ausführen des Klicks auf das Element 1 ist mir aufgefallen, dass jquery den Zustand der style.display des Elements 2 auf ” gesetzt hat, also warte ich nach dem Klicken etwas, um es wieder auf ‘blockieren’ zu setzen, ich weiß es ist hässlich, aber ich habe damals nichts besseres gefunden

Dies geschieht aufgrund der festen Position. Ändern Sie mithilfe von CSS die Position für das übergeordnete Element von fest auf absolut und es funktioniert perfekt. Zum Beispiel: Position von .Seitenleiste fest ist, lass es so. Position wechseln für .sidebar.introjs-fixParent zu absolut.

Hoffe es hilft dir

1068950cookie-checkVerwenden Sie intro.js für das Bootstrap-Dropdown-Element

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy