私はそれのほとんどを書き直しました。ステータスを設定し、必要に応じて 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/