제이쿼리 질문 드립니다(모달 배경 클릭시 클래스 제거) 채택완료

3551634313_1657173022.9103.png

스터디용으로 나이키 사이트를 카피하고 있습니다.

960px 이하에서 작동하는 모바일메뉴를 만들고 있는데,

따로 close 버튼 없이 배경을 클릭하면 들어가게 만들고 싶거든요,,

.slide_menu_wrap에 배경을 주었고 그 안에 .slide_menu가 있는 구조입니다.

이벤트 타겟으로 wrap 클릭, 클릭 대상이 .slide_menu가 아니라면 닫기

이런식으로 짰는데 안되네요..

제 머리론 이 이상 방법이 생각나지 않아서.. 도움주실 분 구합니다.. ㅠ

Copy
function slideMenuOpen(){
  $('.slide_menu_wrap').addClass('on');
}

$(function(){

        $('.slide_menu_wrap.on').on('click', function(e) { 
            
            if( e.target != $('.slide_menu') ){ 
               return false;
            }else{
                $('.slide_menu_wrap').removeClass('on');
            }

    });

});

답변 3개

채택된 답변
+20 포인트
Copy
if( $(e.target) == $('.slide_menu') ){ 
alert("확인");
               return false;
            }else{
                $('.slide_menu_wrap').removeClass('on');
alert("확인2");
            }

이런식으로 정확히 동작하는지 체크하신 후에 removeClass 말고 그냥 display:none 를 해주면 없어지지 않나요?

$('.slide_menu_wrap').css('display', 'none');

다시 살릴때는

$('.slide_menu_wrap').css('display', '');

로그인 후 평가할 수 있습니다

답변에 대한 댓글 6개

오 감사합니다! 이걸로 확인해보니까 계속 확인2가 뜨네요 ㅠ
wrap의 자식 요소라서 slide_menu를 클릭해도 계속 wrap을 클릭한걸로 인식하나봐요..

자식선택하는 법을 찾아봐야겠어요 큰 도움 되었네요 감사합니다!
slide_menu를 클릭했을때, slide_wrap을 클릭했을때로 나눠서 작성해주었더니 잘 작동됩니다 감사합니다!!
지식인이면 내공 드리고 싶을 정도로 감사해요 ㅠㅠ

[code]
$('.slide_menu').click(function(){
alert("확인");
return false;

});

$('.slide_menu_wrap').click(function(){

$('.slide_menu_wrap').removeClass('on');
alert("확인2");

});
[/code]
ㅎㅎㅎ 도움이되셨다니 다행이네요 ㅋㅋㅋ
그러면 제 답변을 채택해주시면 될 것 같습니다!^^
채택하였습니다!

그런데 새로운 문제가 발생했어요.. slide_menu 안의 a들이 클릭되지 않는 상태가 되었네요,,
return false 때문이겠죠... 어디부터 잘못된것일까요..ㅋㅋㅋ

[code]
$('.slide_menu_wrap').click(function(){

$('.slide_menu').click(function(){
return false;
$('.slide_menu a').click(function(){
event.preventDefault();
});
});
$(this).removeClass('on');
});
[/code]

이런 식으로 쓰면 무리수일까요?..
해결됐다고 생각했는데 새로운 문제에 직면하니 멘붕이네요...
음 return false; 는 왜있는거죵..?ㅋㅋㅋ
$('.slide_menu_wrap').click(function(){

$('.slide_menu').click(function(){
return false;
$('.slide_menu a').click(function(){
그리고 얘네들이 다 안에 들어갈 필요없이 각각 개별적으로 선언해서 쓰셔야할 것 같아요!
$('.slide_menu_wrap').click(function(){
});
$('.slide_menu').click(function(){
)};
$('.slide_menu a').click(function(){
});
이런식으로..
안그러면 제일 상위 클릭이 안되면 그 안에있는 얘들은 실행조차 안되니까요!
해결되었습니다 감사합니다!!

[code]
$('.slide_menu_wrap').click(function(){
$(this).removeClass('on');
});

$('.slide_menu').click(function(){
return false;
});

$('.slide_menu a').click(function(){
event.stopPropagation();
});
[/code]

댓글을 작성하려면 로그인이 필요합니다.

e.target 이 slide_menu와 같으면 return false;

아니면 removeClass로 해야하는데 바보같이 썼네요,,

하지만 여전히 되지 않고 있습니다 도와주세요 ㅠㅠ

Copy
$('.slide_menu_wrap.on').on('click', function(e) { 
            
            if( $(e.target) == $('.slide_menu') ){ 
               return false;
            }else{
                $('.slide_menu_wrap').removeClass('on');
            }

        });
로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

클릭이벤트 주어를 .slide_menu_wrap.on 으로 하면 아예 클릭이 안되는 것 같고
.slide_menu_wrap 으로 하니까 등호 갯수에 따라 어딜 눌러도 닫히거나, 어딜 눌러도 안닫히거나 하네요,, ㅠ

댓글을 작성하려면 로그인이 필요합니다.

e.target != $('.slide_menu')
 

비교하는 객체가 Element와 jquery 객체라서 다를수밖예 없습니다
$(e.target) != $('.slide_menu')
비교문을 사용하시려면 로 하셔야 됩니다
 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

그 부분 수정해봐도 작동이 안되네요 ㅠ
혹시나 해서 등호 갯수를 바꿔봐도,, $(e.target)을 변수에 담아봐도,,
몇 시간동안 붙잡고 있어요 ㅠ

function(e)는 제가 잘 안써봐서 그런지,,
혹시 다른 좋은 방법이 있을까요?

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인
🐛 버그신고