我重写了大部分内容,我更喜欢设置状态并让 CSS 在适当的时候处理显示和隐藏。如上所述,大多数问题的出现是因为一旦将事件处理程序绑定到 DOM 对象,添加或删除类不再重要,事情仍然保持绑定。
无论如何,代码如下: HTML 未更改
Javascript:
$ = jQuery;
$('.citychooser').on('click', '.heading', null,
function () {
$(this).parent().addClass('choosing');
});
$('.citychooser').on('click', '.city', null,
function () {
if($(this).closest('.citychooser').hasClass('choosing'))
{
$(this).addClass('active');
$(this).parent().removeClass('choosing').addClass('chosen');
} else {
$(this).removeClass('active');
$(this).parent().addClass('choosing').removeClass('chosen');
}
});
CSS:
.citychooser.chosen .heading{
display:none;
}
.citychooser.chosen .city{
display:none;
}
.citychooser.chosen .city.active{
display:block;
}
.citychooser .city {
display:none;
}
.citychooser.choosing .city {
display:block;
}
.citychooser.choosing .header{
display:block;
}
.city:hover {
background-color: #808080;
}
.cityhover {
background-color: #808080!important;
}
.citychooser {
width: 555px;
float: right;
list-style-type: none;
margin-top: 0px;
}
.citychooser li {
background-color: #cccccc;
margin-bottom: 5px;
height: 50px;
line-height: 50px;
}
.citychooser .heading {
text-indent: 20px;
}
jsfiddle:http: //jsfiddle.net/aLj3V/7/
如果您希望在重新选择时背景保持黑暗,直到选择新项目,您可以使用以下 javascript:
$ = jQuery;
$('.citychooser').on('click', '.heading', null,
function () {
$(this).parent().addClass('choosing');
});
$('.citychooser').on('click', '.city', null,
function () {
if($(this).closest('.citychooser').hasClass('choosing'))
{
$(this).parent().find('.active').removeClass('active');
$(this).addClass('active');
$(this).parent().removeClass('choosing').addClass('chosen');
} else {
$(this).parent().addClass('choosing').removeClass('chosen');
}
});
jsfiddle:http: //jsfiddle.net/aLj3V/8/