Toggle сохраняет свое состояние на объекте, на котором вы его вызываете.Каждый раз, когда вы вызываете Toggle, он переключается между функцией 1 и функцией 2. Он ничего не знает о вашем приложении.Он просто чередует две функции, которые вы передаете, каждый раз, когда вы вызываете его.
Когда вы сбрасываете состояние всплывающего окна без использования Toggle, оно не синхронизируется, так как теперь не имеет представления о том, что вы хотите использовать.вернуться к первому состоянию.Поэтому, когда вы нажимаете снова, он выполняет вторую функцию, когда вы хотите, чтобы она выполнила первую функцию.
Лучший способ решить эту проблему - использовать что-то более умное, чем Toggle.Вам нужно либо определить, открыто ли всплывающее окно и действовать соответствующим образом, либо сохранить какое-либо состояние, независимо от того, открыто оно или нет.Вы не можете использовать Toggle, потому что он недостаточно умен для вашего приложения.
Работая с вашим реальным кодом, я также обнаружил, что обработка события mouseup в документе не очень совместима с обработкой события clickв объекте.Проблема заключается в том, что mouseup предшествует щелчку, поэтому вы получите оба события в последовательности, и вы не получите желаемого эффекта.Когда я переключился на щелчок в документе, он работал намного проще, например:
$("#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/