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/
Спасибо! Отличное решение и отзывы. –