2014-11-27 3 views
0

Я написал несколько событий для обработки открывания и закрывания ящика jap-ящика. Этот код ниже работает, но я чувствую, что он может быть написан более эффективно. Какие-либо предложения?Несколько обработчиков кликов для одного элемента

function openMobileMenu() { 
    event.preventDefault(); 
    snapper.open('left'); 
    $('#btn-menu').off('click', openMobileMenu); 
    $('#btn-menu').on('click', closeMobileMenu); 
} 

function closeMobileMenu() { 
    event.preventDefault(); 
    snapper.close('left'); 
    $('#btn-menu').on('click', openMobileMenu); 
    $('#btn-menu').off('click', closeMobileMenu); 
} 

$('#btn-menu').on('click', openMobileMenu); 

ответ

1

Сделайте свой код модульным и четко сформулируйте свои концепции.

Вы можете начать с создания объекта MobileMenu, который инкапсулирует логику.

Примечание: Следующий код не был протестирован.

var MobileMenu = { 
    _snapper: null, 
    _$button: null, 
    _direction: 'left', 
    init: function (button, snapper, direction) { 
     this._$button = $(button); 
     this._snapper = snapper; 
     if (direction) this._direction = direction; 

     this._toggleSnapperVisibilityWhenButtonClicked(); 
    }, 
    _toggleSnapperVisibilityWhenbuttonClicked: function() { 
     this._$button.click($.proxy(this.toggle, this)); 
    }, 
    toggle: function() { 
     var snapperClosed = this._snapper.state().state == 'closed', 
      operation = snapperClosed? 'open' : 'closed'; 

     this._snapper[operation](this._direction); 
    } 
}; 

Тогда на вашей странице, вы можете просто сделать следующее для инициализации функции:

var mobileMenu = Object.create(MobileMenu).init('#btn-menu', snapper); 

Модуляризации кода сделает его более легким в обслуживании и понятным в долгосрочной перспективе, но и позволят вам блок проверит его. Вы также получаете гораздо больше гибкости из-за открытого API вашего компонента, который позволяет другому коду взаимодействовать с ним.

E.g. теперь вы можете переключать видимость меню с mobileMenu.toggle().

+0

Мне очень нравится то, что вы здесь сделали. Хотя два вопроса. 1) Зачем использовать знак подчеркивания для объявлений переменных? 2) Я вызываю свой текущий скрипт из scripts.js. Как реализовать объект MobileMenu с этой настройкой. – certainstrings

+0

@certainstrings 1) '_' перед именами переменных является популярным соглашением об именах, чтобы идентифицировать, что они должны быть частными членами и не должны быть доступны или изменены извне. 2) Вы можете либо поместить его в свой собственный файл (например, «mobile-menu.js') и включить его на свою страницу. Если вы закончите со многими сценариями, вы можете использовать компилятор, такой как Google Closure, для автоматического создания одного свернутого файла из нескольких файлов сценариев. – plalx

+0

Спасибо. Я решил, что это соглашение об именах, просто не было знакомы с ссылкой на javascript. – certainstrings

1

Используйте переменную для отслеживания состояния:

var menu_open = false; 
$("#btn-menu").on('click', function(event) { 
    event.preventDefault(); 
    if (menu_open) { 
     snapper.close('left'); 
    } else { 
     snapper.open('left'); 
    } 
    menu_open = !menu_open; // toggle variable 
}); 
1

оснастки имеет .state() метод, который возвращает объект набитый свойств, одним из которых является .state.

Я думаю, что вы хотите:

$('#btn-menu').on('click', function() { 
    if(snapper.state().state == "closed") { 
     snapper.open('left'); 
    } else { 
     snapper.close('left'); 
    } 
}); 

Или в одной строке:

$('#btn-menu').on('click', function() { 
    snapper[['close','open'][+(snapper.state().state == 'closed')]]('left'); 
}); 

Кроме того, проверьте How do I make a toggle button? в документации.

+0

Я украл ваш 'snapper.state()', надеюсь, что вы не против ...;) – plalx

+0

Это не мое - я использую инкапсуляторы everyhwere:/ –

+0

Это чище, чем я написал, и он работает. Не понял, что существует метод .state. Прочитайте руководство, я полагаю. – certainstrings

Смежные вопросы