다음 두 가지 방법으로 해결을 할 수 있습니다.
1. 이벤트 버블링으로 인한 body 이벤트 동작시 직접 메뉴에서 클릭하지 않는 경우에만 선택적으로 조건에 따라 슬라이드 올림 처리를 한다.
/*
* 해당 메뉴 클릭시 body에 이벤트가 버블링되므로 body에서 다음과 같은 처리가 필요
*/
$("body").click(function(event) {
var $target = $("#link1"); // 이벤트가 최초 발생한 대상을 검사하기 위한 기준대상 준비
// 버블링되어 오는 이벤트 객체에서 $target을 포함하고 있는지에 대한 검사를 하며 해당 되지 않는 경우에만 슬라이드 올림 처리
if (!$target.is(event.target) && $target.has(event.target).length === 0) {
if(toggle_menu) {
$(".submenu").slideUp(300);
toggle_menu=!toggle_menu
}
}
});
2. 이벤트 버블링을 막는 방법으로 처리한다. jQuery에서는 핸들러에서 코드 수행후 false를 반환하면 이벤트 버블링을 중지한다.
$('#link1').click(function(event) {
// 기존 코드
// false를 반환한다.
return false;
}
$("body").click(function(event) {
if (toggle_menu) {
$(".submenu").slideUp(300);
toggle_menu = !toggle_menu
}
});