사용자가 외부를 클릭 할 때 jQuery를 사용하여 DIV 숨기기


967

이 코드를 사용하고 있습니다 :

$('body').click(function() {
   $('.form_wrapper').hide();
});

$('.form_wrapper').click(function(event){
   event.stopPropagation();
});

그리고이 HTML :

<div class="form_wrapper">
   <a class="agree" href="javascript:;">I Agree</a>
   <a class="disagree" href="javascript:;">Disagree</a>
</div>

문제는 div클릭 할 때 더 이상 링크가 작동하지 않는다는 것입니다.


6
:이 같은 시도 할 수 있습니다 일반 자바 스크립트를 사용 jsfiddle.net/aamir/y7mEY
아미르 아프 리디

를 사용 $('html')하거나 $(document)더 나은 것$('body')
Adrien Be

답변:


2484

같은 문제가 있었지만이 쉬운 해결책을 생각해 냈습니다. 재귀 적으로 작동합니다.

$(document).mouseup(function(e) 
{
    var container = $("YOUR CONTAINER SELECTOR");

    // if the target of the click isn't the container nor a descendant of the container
    if (!container.is(e.target) && container.has(e.target).length === 0) 
    {
        container.hide();
    }
});

19
내 프로젝트에 넣으십시오.하지만 약간의 조정으로 요소 배열을 사용하여 한 번에 반복합니다. jsfiddle.net/LCB5W
토마스

5
@mpelzsherman 많은 사람들이이 스 니펫이 터치 장치에서 작동한다고 언급했지만 게시물이 편집 된 이후이 주석은 다소 사라졌습니다. TBH 특정 이유로 "mouseup"을 사용했는지 여부는 알 수 없지만 "click"과 함께 작동하는 경우 "click"을 사용하지 않아야 할 이유가 없습니다.

6
이 이벤트로 컨테이너를 한 번 숨길 필요가 있었 으므로이 콜백은 사용할 때 파괴되어야합니다. 이를 위해 bind ( "click.namespace")와 함께 click 이벤트에 네임 스페이스를 사용했으며 이벤트가 발생하면 unbind ( "click.namespace")를 호출합니다. 그리고 마지막으로 컨테이너를 인식하기 위해 $ (e.target) .closest ( ". container"). length을 사용했습니다 ... 그래서이 답변의 트릭을 사용하지 않았습니다 : D
Loenix

80
$("YOUR CONTAINER SELECTOR").unbind( 'click', clickDocument );바로 옆 에 사용하는 것을 기억하십시오.hide() . 그래서 document클릭을 수신 보관하지 않습니다.
brasofilo

12
모범 사례를 $(document).on("mouseup.hideDocClick", function () { ... });위해 컨테이너를 여는 함수와 $(document).off('.hideDocClick');숨기기 기능을 작성했습니다. 네임 스페이스를 사용 mouseup하여 문서에 연결된 다른 가능한 리스너를 제거하지 않습니다 .
campsjos

204

다음과 같은 것을 사용하는 것이 좋습니다.

var mouse_is_inside = false;

$(document).ready(function()
{
    $('.form_content').hover(function(){ 
        mouse_is_inside=true; 
    }, function(){ 
        mouse_is_inside=false; 
    });

    $("body").mouseup(function(){ 
        if(! mouse_is_inside) $('.form_wrapper').hide();
    });
});

얼마나 영리한가! 이 기술은 표준입니까?
8

@advait 나는 그것이 이전에 사용 된 것을 보지 못했습니다. 그것은 모든 hover가능성을 열어 주는 이벤트 핸들러 에 관한 것입니다.
Makram Saleh

5
사람들이 창 개체 (= 전역 변수 사용)를 채우는 것이 좋다고 생각할 수 있기 때문에 이것이 좋은 해결책이라고 생각하지 않습니다.

1
@ prc322가 말한 것에 무언가를 추가하기 위해 코드를 익명 함수로 감싸서 즉시 호출 할 수 있습니다. (function() { // ... code })(); 이 패턴의 이름은 기억 나지 않지만 매우 유용합니다! 선언 된 모든 변수는 함수 내에 상주하며 전역 네임 스페이스를 오염시키지 않습니다.
pedromanoel

3
@ prc322 변수의 범위를 변경하는 방법조차 모른다면, 당신은 맞습니다.이 솔루션은 당신에게 좋지 않습니다 ... 그리고 JavaScript도 아닙니다. 스택 오버플로에서 코드를 복사하여 붙여 넣는 경우 창 개체의 내용을 덮어 쓰는 것보다 훨씬 많은 문제가 있습니다.
Gavin

87

이 코드는 페이지에서 클릭 이벤트를 감지 한 다음 #CONTAINER클릭 한 #CONTAINER요소가 요소 나 하위 요소 중 하나 가 아닌 경우에만 요소 를 숨 깁니다 .

$(document).on('click', function (e) {
    if ($(e.target).closest("#CONTAINER").length === 0) {
        $("#CONTAINER").hide();
    }
});

이것은 완벽 해요!!
Mohd Abdul Mujib

@ 9KSoft 나는 당신을 도울 수있어서 기쁘다. 의견과 행운을 주셔서 감사합니다.
Case

이 솔루션은 컨테이너로 div를 사용하여 완벽하게 작동했습니다!
JCO9

76

stopPropagation에 의존하지 않고 본문에 대해 발생하는 클릭 이벤트의 대상을 점검 할 수 있습니다.

다음과 같은 것 :

$("body").click
(
  function(e)
  {
    if(e.target.className !== "form_wrapper")
    {
      $(".form_wrapper").hide();
    }
  }
);

또한 body 요소는 브라우저에 표시된 전체 시각적 공간을 포함하지 않을 수 있습니다. 클릭이 등록되지 않은 경우 HTML 요소에 대해 클릭 핸들러를 추가해야합니다.


네, 이제 링크가 작동합니다! 그러나 어떤 이유로 링크를 클릭하면 두 번 실행됩니다.
Scott Yu-

나는 이것의 변형을 사용했다. 먼저 요소가 보이는지 확인한 다음 target.hasClass가 있으면 숨 깁니다.
Hawkee

e.stopPropagation();다른 클릭 청취자가 있다면 잊지
마십시오

2
-1. form_wrapper자식 중 하나를 클릭하면 원하는 동작 이 아닌를 숨 깁니다 . 대신 prc322의 답변을 사용하십시오.
Mark Amery

38

라이브 데모

클릭 영역이 타겟팅 된 요소 또는 하위 요소에 없는지 확인

$(document).click(function (e) {
    if ($(e.target).parents(".dropdown").length === 0) {
        $(".dropdown").hide();
    }
});

최신 정보:

jQuery 중지 전파가 최고의 솔루션입니다

라이브 데모

$(".button").click(function(e){
    $(".dropdown").show();
     e.stopPropagation();
});

$(".dropdown").click(function(e){
    e.stopPropagation();
});

$(document).click(function(){
    $(".dropdown").hide();
});

업데이트 주셔서 감사합니다, 완벽합니다! 터치 장치에서 작동합니까?
FFish

1
이 경우 페이지에 여러 드롭 다운이 있습니다. 드롭 다운을 열기 전에 모든 드롭 다운을 닫아야한다고 생각합니다 clicked. 그렇지 않으면 stopPropagation여러 드롭 다운이 동시에 열려있을 수 있습니다.
T04435

19
$(document).click(function(event) {
    if ( !$(event.target).hasClass('form_wrapper')) {
         $(".form_wrapper").hide();
    }
});

2
흠 ... div 내부의 무언가를 클릭하면 어떤 이유로 전체 div가 사라집니다.
Scott Yu-

11
대상에 클래스가 있는지 확인하는 대신 다음을 시도하십시오. if ($ (event.target) .closest ( '. form_wrapper) .get (0) == null) {$ ( ". form_wrapper"). hide (); } 이렇게하면 div 내부의 항목을 클릭해도 div가 숨겨지지 않습니다.
John Haager

17

솔루션을 다음과 같이 업데이트했습니다.

  • 대신 mouseenter와 mouseleave를 사용하십시오.
  • 호버 사용 라이브 이벤트 바인딩

var mouseOverActiveElement = false;

$('.active').live('mouseenter', function(){
    mouseOverActiveElement = true; 
}).live('mouseleave', function(){ 
    mouseOverActiveElement = false; 
});
$("html").click(function(){ 
    if (!mouseOverActiveElement) {
        console.log('clicked outside active element');
    }
});

1
.live지금은 사용되지는 ; 사용하는 .on대신.
Brett


9

ESC기능을 갖춘 라이브 데모

데스크톱과 모바일 모두에서 작동

var notH = 1,
    $pop = $('.form_wrapper').hover(function(){ notH^=1; });

$(document).on('mousedown keydown', function( e ){
  if(notH||e.which==27) $pop.hide();
});

어떤 경우에는 문서를 클릭 할 때 요소가 실제로 보이는지 확인해야합니다. if($pop.is(':visible') && (notH||e.which==27)) $pop.hide();


8

이런 식으로 작동하지 않습니까?

$("body *").not(".form_wrapper").click(function() {

});

또는

$("body *:not(.form_wrapper)").click(function() {

});

4
이 답변은 정확하지 않습니다. 여기에 많은 답변과 마찬가지로 .form_wrapper자녀를 클릭하면 (다른 문제 중에서) 가 숨겨 집니다.
Mark Amery

6

슬리커 :

$("html").click(function(){ 
    $(".wrapper:visible").hide();
});

4
이 답변은 정확하지 않습니다. 이것은 .wrapper페이지를 어디에서 클릭하든 상관없이 숨겨져 있습니다.
Mark Amery

6

DOM을 한 번 클릭 할 때마다 하나의 특정 요소를 숨기지 tabindex않고 부모로 설정 <div>하고focusout 이벤트를 있습니다.

설정 tabindex하면 blur이벤트가<div> (일반적으로 하지 않음)에 시작됩니다.

따라서 HTML은 다음과 같습니다.

<div class="form_wrapper" tabindex="0">
    <a class="agree" href="javascript:;">I Agree</a>
    <a class="disagree" href="javascript:;">Disagree</a>
</div>

그리고 당신의 JS :

$('.form_wrapper').on('focusout', function(event){
    $('.form_wrapper').hide();
});

5

IPAD 및 IPHONE과 같은 터치 장치의 경우 다음 코드를 사용할 수 있습니다

$(document).on('touchstart', function (event) {
var container = $("YOUR CONTAINER SELECTOR");

if (!container.is(e.target) // if the target of the click isn't the container...
&& container.has(e.target).length === 0) // ... nor a descendant of the container
    {
        container.hide();
    }
});

5

다음은 다른 스레드에서 찾은 jsfiddle이며 esc 키와 함께 작동합니다. http://jsfiddle.net/S5ftb/404

    var button = $('#open')[0]
    var el     = $('#test')[0]

    $(button).on('click', function(e) {
      $(el).show()
      e.stopPropagation()
    })

    $(document).on('click', function(e) {
      if ($(e.target).closest(el).length === 0) {
        $(el).hide()
      }
    })

    $(document).on('keydown', function(e) {
      if (e.keyCode === 27) {
        $(el).hide()
      }
    })

'click'이벤트가 #test 요소 내에 있는지 여부를 감지합니다. jsfiddle.net/TA96A 와 같은 링크 테스트를 시도 했으며 작동하는 것처럼 보입니다.
Thomas W

예, 링크 외부의 jsfiddle 블록처럼 보입니다. http : // jsfiddle.net을 사용하면 결과 페이지가 링크를 처리하는 것을 볼 수 있습니다 :)
djv

5

prc322의 멋진 답변으로 만들어졌습니다.

function hideContainerOnMouseClickOut(selector, callback) {
  var args = Array.prototype.slice.call(arguments); // Save/convert arguments to array since we won't be able to access these within .on()
  $(document).on("mouseup.clickOFF touchend.clickOFF", function (e) {
    var container = $(selector);

    if (!container.is(e.target) // if the target of the click isn't the container...
        && container.has(e.target).length === 0) // ... nor a descendant of the container
    {
      container.hide();
      $(document).off("mouseup.clickOFF touchend.clickOFF");
      if (callback) callback.apply(this, args);
    }
  });
}

이것은 몇 가지를 추가합니다 ...

  1. "무제한"인수가있는 콜백이있는 함수 내에 배치
  2. 이벤트가 실행되면 문서에서 이벤트를 바인딩 해제하기 위해 이벤트 네임 스페이스와 함께 jquery의 .off ()에 대한 호출을 추가했습니다.
  3. 모바일 기능을위한 포함 된 터치 엔드

나는 이것이 누군가를 돕기를 바랍니다!



4

(prc322의 답변에 추가하십시오.)

필자의 경우이 코드를 사용하여 사용자가 적절한 탭을 클릭 할 때 나타나는 탐색 메뉴를 숨기고 있습니다. 컨테이너 외부의 클릭 대상이 링크 가 아닌 추가 조건을 추가하는 것이 유용하다는 것을 알았습니다 .

$(document).mouseup(function (e)
{
    var container = $("YOUR CONTAINER SELECTOR");

    if (!$("a").is(e.target) // if the target of the click isn't a link ...
        && !container.is(e.target) // ... or the container ...
        && container.has(e.target).length === 0) // ... or a descendant of the container
    {
        container.hide();
    }
});

내 사이트의 일부 링크가 페이지에 새 콘텐츠를 추가하기 때문입니다. 탐색 메뉴가 사라지는 동시에이 새 컨텐츠가 추가되면 사용자에게 혼란을 줄 수 있습니다.


4

너무 많은 답변은 하나를 추가 할 수있는 통과 권이어야합니다 ... 현재 (jQuery 3.1.1) 답변을 보지 못했습니다.

$(function() {
    $('body').on('mouseup', function() {
        $('#your-selector').hide();
    });
});

3
var n = 0;
$("#container").mouseenter(function() {
n = 0;

}).mouseleave(function() {
n = 1;
});

$("html").click(function(){ 
if (n == 1) {
alert("clickoutside");
}
});

3
 $('body').click(function(event) {
    if (!$(event.target).is('p'))
    {
        $("#e2ma-menu").hide();
    }
});

p요소 이름입니다. id 또는 클래스 또는 요소 이름도 전달할 수 있습니다.


3

.form_wrapper를 클릭하면 false를 반환합니다.

$('body').click(function() {
  $('.form_wrapper').click(function(){
  return false
});
   $('.form_wrapper').hide();
});

//$('.form_wrapper').click(function(event){
//   event.stopPropagation();
//});

3

다음과 같이 클릭 이벤트를 양식 랩퍼 외부의 최상위 레벨 요소에 첨부하십시오.

$('#header, #content, #footer').click(function(){
    $('.form_wrapper').hide();
});

터치 장치에서도 작동합니다. 선택기 목록에 .form_wrapper의 부모를 포함시키지 마십시오.


3

var exclude_div = $("#ExcludedDiv");;  
$(document).click(function(e){
   if( !exclude_div.is( e.target ) )  // if target div is not the one you want to exclude then add the class hidden
        $(".myDiv1").addClass("hidden");  

}); 

깡깡이


3

$(document).ready(function() {
	$('.modal-container').on('click', function(e) {
	  if(e.target == $(this)[0]) {
		$(this).removeClass('active'); // or hide()
	  }
	});
});
.modal-container {
	display: none;
	justify-content: center;
	align-items: center;
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	background-color: rgba(0,0,0,0.5);
	z-index: 999;
}

.modal-container.active {
    display: flex;  
}

.modal {
	width: 50%;
	height: auto;
	margin: 20px;
	padding: 20px;
	background-color: #fff;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="modal-container active">
	<div class="modal">
		<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ac varius purus. Ut consectetur viverra nibh nec maximus. Nam luctus ligula quis arcu accumsan euismod. Pellentesque imperdiet volutpat mi et cursus. Sed consectetur sed tellus ut finibus. Suspendisse porttitor laoreet lobortis. Nam ut blandit metus, ut interdum purus.</p>
	</div>
</div>


3

https://sdtuts.com/click-on-not-specified-element/ 에서 복사

라이브 데모 http://demos.sdtuts.com/click-on-specified-element

$(document).ready(function () {
    var is_specified_clicked;
    $(".specified_element").click(function () {
        is_specified_clicked = true;
        setTimeout(function () {
            is_specified_clicked = false;
        }, 200);
    })
    $("*").click(function () {
        if (is_specified_clicked == true) {
//WRITE CODE HERE FOR CLICKED ON OTHER ELEMENTS
            $(".event_result").text("you were clicked on specified element");
        } else {
//WRITE CODE HERE FOR SPECIFIED ELEMENT CLICKED
            $(".event_result").text("you were clicked not on specified element");
        }
    })
})

2

나는 이것을 이렇게했다 :

var close = true;

$(function () {

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

        if(close){
            div.hide();
        }
        close = true;
    })


alleswasdenlayeronclicknichtschliessensoll.click( function () {   
        close = false;
    });

});

2
dojo.query(document.body).connect('mouseup',function (e)
{
    var obj = dojo.position(dojo.query('div#divselector')[0]);
    if (!((e.clientX > obj.x && e.clientX <(obj.x+obj.w)) && (e.clientY > obj.y && e.clientY <(obj.y+obj.h))) ){
        MyDive.Hide(id);
    }
});

2

이 코드를 사용하면 원하는만큼 많은 항목을 숨길 수 있습니다

var boxArray = ["first element's id","second element's id","nth element's id"];
   window.addEventListener('mouseup', function(event){
   for(var i=0; i < boxArray.length; i++){
    var box = document.getElementById(boxArray[i]);
    if(event.target != box && event.target.parentNode != box){
        box.style.display = 'none';
    }
   }
})

1

할 수있는 일은 클릭 이벤트를 문서에 바인딩하여 드롭 다운 외부의 무언가를 클릭하면 드롭 다운을 숨기지 만 드롭 다운 내부의 무언가를 클릭하면 숨겨지지 않으므로 "쇼"이벤트 (또는 슬라이드 다운 또는 기타 드롭 다운을 보여줍니다)

    $('.form_wrapper').show(function(){

        $(document).bind('click', function (e) {
            var clicked = $(e.target);
            if (!clicked.parents().hasClass("class-of-dropdown-container")) {
                 $('.form_wrapper').hide();
            }
        });

    });

그런 다음 숨길 때 클릭 이벤트 바인딩을 해제하십시오.

$(document).unbind('click');

0

워드 프로세서에 따르면 , .blur()이상 작동 <input>태그입니다. 예를 들면 다음과 같습니다.

$('.form_wrapper').blur(function(){
   $(this).hide();
});

-1, 작동하지 않습니다. 매우 흥미로운 아이디어이지만 jQuery 문서는 잘못되었습니다. 예를 들어 developer.mozilla.org/en-US/docs/Web/API/…를 참조하십시오 . 이 이벤트와 함께 작동하지 마십시오. " 또한 Chrome에서 테스트되었으며 div결코 흐려지지 않습니다. 흐림 이벤트는 자녀에게서 거품을 일으켜도 버블 링 할 수 없습니다. 마지막으로 위의 내용이 사실이 아니더라도 .form_wrapper사용자가 클릭하기 전에 초점이 맞았는지 확인한 경우에만 작동 합니다.
Mark Amery
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.