Toggleは、呼び出したオブジェクトの状態を保存します。Toggleを呼び出すたびに、関数1と関数2が交互に切り替わります。アプリについては他に何も知りません。呼び出すたびに、渡す2つの関数を交互に切り替えます。
Toggleを使用せずにポップアップの状態をリセットすると、最初の状態に戻りたいことがわからなくなるため、ポップアップの同期がとれなくなります。したがって、もう一度クリックすると、最初の関数を実行するときに2番目の関数が実行されます。
この問題を解決する最善の方法は、Toggleよりも賢いものを使用することです。ポップアップが開いているかどうかを検出してそれに応じて動作するか、ポップアップが開いているかどうかに関する状態を保存する必要があります。Toggleはアプリケーションにとって十分に賢くないため、使用できません。
実際のコードを操作しているときに、ドキュメントでのmouseupイベントの処理は、オブジェクトでのclickイベントの処理とあまり互換性がないこともわかりました。問題は、マウスアップがクリックの前に行われるため、両方のイベントが順番に取得され、希望する効果が得られないことです。ドキュメントのクリックに変更すると、次のように非常に簡単に機能しました。
$("#general_show").click(function () {
var $this = $(this);
if ($this.hasClass('selected')) {
$this.removeClass('selected').parent().next().hide();
} else {
$this.addClass('selected').parent().next().show();
}
return(false);
});
$(document).click(function (e) {
if ($('#general_info').is(':visible') &&
$(e.target).parents('#general_info').length === 0) {
$('#general_show').removeClass('selected').parent().next().hide();
return(false);
}
});
実例: http: //jsfiddle.net/jfriend00/KTNAq/