单个元素的多个单击处理程序
Multiple click handlers for a single element
我写了一些事件来处理快照js抽屉的打开和关闭。下面的代码有效,但我觉得它可以更有效地编写。有什么建议吗?
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);
使你的代码模块化,你的概念明确。
您可以从创建一个封装逻辑的 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,允许其他代码与之交互,因此您还可以获得更灵活的收益。
例如,您现在可以使用mobileMenu.toggle()
切换菜单可见性。
使用变量来跟踪状态:
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
});
snap
有一个 .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');
});
另外,请查看文档中的如何制作切换按钮?
相关文章:
- 将参数传递给reactjs单击处理程序
- 元素单击处理程序由一个神秘的函数取消设置
- 将单击处理程序附加到动态生成的锚标记
- 为什么在模糊事件处理程序中添加setTimeout会修复“;掩蔽”;另一个单击处理程序的
- 使用运行时创建的链接来触发ASP.Net中隐藏按钮的单击处理程序
- 将单击处理程序绑定到动态元素
- 在另一个C#按钮单击处理程序之前,从OnClientClick函数调用C#按钮处理程序
- 如何通过单击处理程序进行导航
- 触摸事件处理程序将覆盖单击处理程序
- 将单击处理程序设置为动态创建的按钮
- 插入内容后,Iframe 中的单击处理程序不起作用
- OL3 是否有单击处理程序像素容差设置
- 将单击处理程序绑定到除特定 HTML 标记之外的所有元素
- 在 vis 中访问节点数据.js单击处理程序
- 在 Javascript 中启用/禁用按钮单击处理程序
- 如何在单击处理程序中使用反应路由器 1.0.x 进行客户端路由
- 为什么列表视图单击处理程序在启动时执行函数
- 来自 setTimeout 的 Jquery 单击处理程序
- 更改 jQuery 单击处理程序功能
- 使用单击处理程序时出现“系统未定义”JavaScript 错误