jQuery将单击事件合并到一个DRY代码块中
jQuery merge click event into a single DRY code block
这两个代码块本质上是相同的,只是有不同的元素。我该如何将它们合并到一个可重复使用的脚本中
$('.menu-button').on('click', function(e) {
e.preventDefault();
e.stopPropagation();
$('#sidebar').toggleClass('sidebar-open');
$('#cart').removeClass('cart-open');
$(document).one('click', function closeMenu (e){
//console.log("DF");
if($('#sidebar').has(e.target).length === 0){
console.log("DF");
$('#sidebar').removeClass('sidebar-open');
} else {
$(document).one('click', closeMenu);
}
});
});
$('.cart-button').on('click', function(e) {
e.preventDefault();
e.stopPropagation();
$('#sidebar').removeClass('sidebar-open');
$('#cart').toggleClass('cart-open');
$(document).one('click', function closeMenu (e){
//console.log("DF");
if($('#cart').has(e.target).length === 0){
$('#cart').removeClass('cart-open');
} else {
$(document).one('click', closeMenu);
}
});
});
尝试为click
事件定义单个处理程序processMenu
;在使用event.target.className
的处理程序中设置选择器elem
var processMenu = function processMenu(e) {
var elem = $(e.target.className === "menu-button" ? "#sidebar" : "#cart");
e.preventDefault();
e.stopPropagation();
$("#sidebar").toggleClass("sidebar-open");
$("#cart").removeClass("cart-open");
$(document).one("click", function closeMenu (evt){
//console.log("DF");
if(elem.has(evt.target).length === 0){
console.log("DF");
elem.removeClass("sidebar-open");
} else {
$(document).one("click", closeMenu);
}
});
};
$(".menu-button, .cart-button").on("click", processMenu);
使用逗号:
$('.menu-button, .cart-button').on('click', function(e) {
var param = $(this).is('.menu-button') ? "sidebar" : "cart";
e.preventDefault();
e.stopPropagation();
$('.cart-open').removeClass('cart-open');
$('.sidebar-open').removeClass('sidebar-open');
$('#' + param).toggleClass(param + '-open');
$(document).one('click', function closeMenu (e){
//console.log("DF");
if($("#" + param).has(e.target).length === 0){
console.log("DF");
$("#" + param).removeClass(param + '-open');
} else {
$(document).one('click', closeMenu);
}
});
});
EDIT:另外,使用一个缩写if语句来确定是否是被点击的侧边栏或购物车,在其余部分中使用。
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- jQuery:循环一个具有不同超时值的循环
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 从javascript创建一个列表
- 节点导出返回一个空对象
- 使用clickToggle并在单击另一个元素时关闭元素
- 我可以在json对象中添加一个函数吗
- 使用javascript将动态表从一个html页面打印到另一个html页
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 表追加而不附加最后一个元素
- 我如何找到一个句子中的所有空格并替换忽略它们
- D3在一个调用中绘制不同的SVG形状,没有可见性
- 如何在android中使用phonegap将文件从一个文件夹移动/复制到另一个文件夹
- 使用类从一个标记中双击事件
- Javascript,访问一个主要对象模块模式中的每个对象
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 如何在elfinder插件(一个文件管理器插件)上获得上传前事件
- 我应该如何从xml文件构建一个javascript页面
- 这里有一个更优雅的/DRY/可维护的JS解决方案
- jQuery将单击事件合并到一个DRY代码块中