Закройте div, нажав на кнопку

Я хочу скрыть div, нажав на ссылку закрытия в нем или, щелкнув в любом месте вне этого div.

Я пытаюсь использовать следующий код, он открывает и закрывает div, правильно щелкнув ссылку, но если у меня есть проблема, чтобы закрыть его, щелкнув в любом месте вне div.

$(".link").click(function() {
  $(".popup").fadeIn(300);
}

);
$('.close').click(function() {
  $(".popup").fadeOut(300);
}

);
$('body').click(function() {
  if (!$(this.target).is('.popup')) {
    $(".popup").hide();
  }
}

);
<div class="box">
  <a href="#" class="link">Open</a>
  <div class="popup">
    Hello world
    <a class="close" href="#">Close</a>
  </div>
</div>

Ответы

Ответ 1

Другой способ, который делает ваш jsfiddle менее багги (требуется двойной щелчок на открытии).

Это не использует делегированное событие для уровня тела

Установите tabindex="-1" в DIV.popup(и для стиля CSS outline:0)

DEMO

$(".link").click(function(e){
    e.preventDefault();
    $(".popup").fadeIn(300,function(){$(this).focus();});
});

$('.close').click(function() {
   $(".popup").fadeOut(300);
});
$(".popup").on('blur',function(){
    $(this).fadeOut(300);
});

Ответ 2

Вам нужно

$('body').click(function(e) {
    if (!$(e.target).closest('.popup').length){
        $(".popup").hide();
    }
});

Ответ 3

Я бы предложил использовать метод stopPropagation(), как показано в модифицированном скрипте:

Fiddle

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

$('.popup').click(function(e) {
    e.stopPropagation();
});

Таким образом, вы можете скрыть всплывающее окно, когда вы нажимаете на тело, не добавляя лишнего, если, и когда вы нажимаете на всплывающее окно, событие не вылетает в тело, просматривая всплывающее окно.

Ответ 4

Вам лучше пойти с чем-то вроде этого. Просто дайте id div, который вы хотите скрыть, и сделайте такую ​​функцию. вызовите эту функцию, добавив событие onclick в тело.

function myFunction(event) { 

if(event.target.id!="target_id")
{ 
    document.getElementById("target_id").style.display="none";
  }
}

Ответ 5

Добавить прозрачный фон, занимающий весь размер окна, перед вашим всплывающим div

.transparent-back{
    position: fixed;
    top: 0px;
    left:0px;
    width: 100%;
    height: 100%;
    background-color: rgba(255,255,255,0.5);
}

Затем нажмите на свой клик, чтобы закрыть всплывающее окно.

$(".transparent-back").on('click',function(){
    $('popup').fadeOut(300);
});

Ответ 6

На этот вопрос можно было ответить здесь. Могут быть некоторые потенциальные проблемы, когда прерывание распространения событий прерывается, как объяснил Филип Уолтон в этот пост.

Лучшим подходом/решением было бы создание пользовательского события jQuery, например. clickoutside. У Бен Альмана есть отличный пост (здесь), в котором объясняется, как реализовать его (а также объясняется, как работают специальные события), и он получил хороший (здесь).

Дополнительная информация о событиях jQuery событий и специальных событиях jQuery:

Ответ 7

 //for closeing the popover when user click outside it will close all popover 
 var hidePopover = function(element) {
        var elementScope = angular.element($(element).siblings('.popover')).scope().$parent;
        elementScope.isOpen = false;
        elementScope.$apply();
        //Remove the popover element from the DOM
        $(element).siblings('.popover').remove();
    };
 $(document).ready(function(){
 $('body').on('click', function (e) {
       $("a").each(function () {
                    //Only do this for all popovers other than the current one that cause this event
           if (!($(this).is(e.target) || $(this).has(e.target).length > 0) 
                && $(this).siblings('.popover').length !== 0 && $(this).siblings('.popover').has(e.target).length === 0)                  
                    {
                         hidePopover(this);
                    }
        });
    });
 });