Подтвердить что ты не робот

Использовать intro.js в раскрывающемся элементе bootstrap

Я не могу понять, как использовать intro.js для выпадающих элементов.

Я нашел аналогичный вопрос без ответа там: Меню IntroJS Bootstrap не работает

Если вы хотите воспроизвести ошибку, выполните следующие действия:

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

Вам нужно нажать "Aide" (зеленая кнопка в правом верхнем углу), проблема возникает для второго шага. в событии изменения я делаю:

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

При отладке все работает как шарм, пока эта функция не закончится: _showElement После этого я теряюсь в событиях JQuery, и выпадающее окно закрывается...

Если вы хотите воспроизвести, просто добавьте точку останова в конце функции _showElement, и вы поймете, что я имею в виду...

4b9b3361

Ответ 1

Здесь более четкое решение

 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);
  });

Обратите внимание, что setTimeout без второго аргумента (миллисекунды) позволяет вам ставить в очередь функцию в цикле событий и запускать ее после обработки всех событий (включая щелчок, закрывающий раскрывающийся список), также лучше добавить класс, открытый для выпадающий список, если вы хотите установить его для открытия состояния

Ответ 2

В шаблоне, т.е. в

/views/nav/body-create.html

У вас есть код, где ng-disabled основан на! currentPath.name. И значение currentPath.name равно null. Попробуйте проверить значение на следующем элементе. Вы увидите, что оно равно null.

<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>

Убедитесь, что у вас есть собственное имя или вы используете другое условие - я не уверен, что вы пытаетесь сделать с условием.

Доказательство. Проверьте этот элемент в хром-отладчике на recherche.utilitaire.melard.fr/#/carto. Введите следующую команду в консоли и нажмите enter.

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

И ваше меню "Niveau" начнет работать.

Ответ 3

Я нашел обходное решение, это довольно уродливо, но делает работу:

$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"); 
};

Я установил атрибут отображения для блокировки сразу после события клика, которое я добавил в событии изменения

При нажатии на щелчок элемента 1 я заметил, что jquery задал состояние style.display элемента 2 в '', поэтому я немного подождал, щелкнув, чтобы вернуть его в 'block', Я знаю это уродливо, но в то время я не нашел ничего лучшего