Обновить состояние кнопки

362
30 января 2017, 19:28

Доброго времени знатоки. Снова нуждаюсь в вашей помощи. Есть анимация svg кнопки "гамбургер". Работает чудесно, нажав на нее открывается и закрывается. Но мне надо добавить, чтобы можно было ее закрыть не нажимая на нее. А закрыв меню скажем свернув нажав в другом месте (не на иконку "гамбургера"). Чтобы запустился обработчик снова.

<script>
        (function nadavi() {
            function SVGHamburger( el, options ) {
                this.el = el;
                this.init();
            }
            SVGHamburger.prototype.init = function() {
                this.shapeEl = this.el.querySelector( 'span.morph-shape' );
                var s = Snap( this.shapeEl.querySelector( 'svg' ) );
                this.pathEl1 = s.select( 'path:nth-of-type(1)' );
                this.pathEl2 = s.select( 'path:nth-of-type(2)' );
                this.paths = {
                    reset : {
                        path1 : this.pathEl1.attr( 'd' ),
                        path2 : this.pathEl2.attr( 'd' )
                    },
                    open : this.shapeEl.getAttribute( 'data-morph-open' ).split( ';' ),
                    close : this.shapeEl.getAttribute( 'data-morph-close' ).split( ';' )
                };
                this.isOpen = false;
                this.initEvents();
            };
            SVGHamburger.prototype.initEvents = function() {
                this.el.addEventListener( 'click', this.toggle.bind(this) );
            };
            SVGHamburger.prototype.toggle = function() {
                var self = this,
                    paths = this.isOpen ? this.paths.close : this.paths.open;
                if( self.isOpen ) {
                    setTimeout( function() { classie.remove( self.el, 'menu-button--open' ); }, 200 );
                }
                else {
                    setTimeout( function() { classie.add( self.el, 'menu-button--open' ); }, 200 );
                }
                this.pathEl1.stop().animate( { 'path' : paths[0] }, 300, mina.easeout, function() {
                    self.pathEl1.stop().animate( { 'path' : self.paths.reset.path1 }, 800, mina.elastic );
                } );
                this.pathEl2.stop().animate( { 'path' : paths[1] }, 300, mina.easeout, function() {
                    self.pathEl2.stop().animate( { 'path' : self.paths.reset.path2 }, 800, mina.elastic );
                } );
                this.isOpen = !this.isOpen;
            };
            new SVGHamburger( document.getElementById( 'menusToggleBt' ) );
        })();

Нажимая на мой код, чтобы закрыть гамбургер, он его закрывает (просто удаляет класс открытой. .removeClass("menu-button--open")

if (document.body.clientWidth<=978) {
    $(".navItem a").click(function(){
        $("#menusToggleBt").removeClass("menu-button--open");

Но когда я снова нажимаю на гамбургер, получается что он думает что открытый... И потому не добавляет класс menu-button--open. И за этого постоянно проблемы. Помогите как мне это правильно обработать. Чтобы скрыв меню (адаптивное выезжающее) оно и закрыло ПРАВИЛЬНО гамбургер.

Вот на всякий случай код самой кнопки: (без стилей)

<button id="menusToggleBt" class="menu-button">
                                                <span class="nadavi" style="margin-right: 5px;" >МЕНЮ</span><span id="morph-shape" class="morph-shape" data-morph-open="M3,20c0,0,12-4,27-4s27,4,27,4;M3,60c0,0,12,4,27,4s27-4,27-4" data-morph-close="M3,20c0,0,12,4,27,4s27-4,27-4;M3,60c0,0,12-4,27-4s27,4,27,4">
                                                    <svg width="100%" height="100%" viewBox="0 0 60 80" preserveAspectRatio="none">
                                                        <path d="M3,20C3,20,15,20,30,20C45,20,57,20,57,20"></path>
                                                        <line x1="3" y1="40" x2="57" y2="40"></line>
                                                        <path d="M3,60C3,60,15,60,30,60C45,60,57,60,57,60"></path>
                                                    </svg>
                                                </span>
                                    </button>
Answer 1

(Что такое - "classie"?)

Не следует хранить отдельный флаг состояния isOpen - он неизбежно когда-нибудь рассинхронизируется с действительным состоянием объекта (что и происходит в Вашем коде). Если Вам понадобится выяснить открыт фрагмент или закрыт, используйте $().hasClass.

SVGHamburger.prototype.toggle = function() {
  var self = this,
      paths = $(this.el).hasClass('menu-button--open') ? 
        this.paths.close : this.paths.open;
  setTimeout(function() { $(self.el).toggleClass('menu-button--open'); }, 200);
  ...  
READ ALSO
Удаление всех ссылок на объект для полной его деинициализации

Удаление всех ссылок на объект для полной его деинициализации

При переписывании ранее написанного кода понадобилось держать в памяти все экземпляры классаВсе экземпляры класса хранятся как статическое...

313
Помогите переделать скрипт

Помогите переделать скрипт

Помогите переделать скрипт чтоб результат выводился так ЧАС:МИНУТ:СЕК

307
используя цикл for пройти все елементы

используя цикл for пройти все елементы

при каждом клике добавлять елементу красный цвет, когда все елементы будут красного цвета, то по одному клику с конца возвращать елеметам...

362