Lofka
Lofka

Reputation: 178

Close Modal in Javascript

I used this code, to create a basic modal : https://codepen.io/paallaire/project/editor/ZBajYk/

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <title>Document</title>
  <link rel="stylesheet" href="main.css">
</head>

<body>

  <div class="c-modal-request js-modal-request-close">


    <div class="c-modal-request__content">

      <a href="#" class="c-modal-request__btn-close js-modal-request-close">Close ME</a>

      <h1>HTML Ipsum Presents</h1>

      <p><strong>Pellentesque habitant morbi tristique</strong> senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. <em>Aenean ultricies mi vitae est.</em>        Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, <code>commodo vitae</code>, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci,
        sagittis tempus lacus enim ac dui. <a href="#">Donec non enim</a> in turpis pulvinar facilisis. Ut felis.</p>

    </div>

  </div>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  <script src="main.js"></script>
</body>

</html>

Goal : If I click in the "red" area or I click on the button "Close me"

Result = the modal closes ( for this example I used jquery.hide() )

But I try to understand why when I click in the white area (modal) the modal close.

Upvotes: 1

Views: 4160

Answers (2)

Mohamed-Yousef
Mohamed-Yousef

Reputation: 24001

The problem is : Your div modal has js-modal-request-close class which is the same class of close me.. For this the div close when clicking inside

To solve that .. you will need to

1

<div class="c-modal-request js-modal-request-close">

it should be

<div class="c-modal-request">

2

e.stopPropagation(); Prevents the event from bubbling up the DOM tree, preventing any parent handlers from being notified of the event.

And you can use it like this

$(document).ready(function() {
  console.log("test");

  console.log($);

  $(".js-modal-request-close , .c-modal-request").on("click", function(e) {
    e.preventDefault();
    $(".c-modal-request").hide();
  });
  $(".c-modal-request__content").on('click' , function(e){
    e.stopPropagation();
  });
});
.c-modal-request {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 300;
  width: 100%;
  height: 100%;
  background-color: red;
}

.c-modal-request__content {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  padding: 60px;
  max-width: 720px;
  width: 100%;
  overflow-y: auto;
  background-color: #fff;
  position: relative;
  z-index: 400;
}

.c-modal-request__btn-close {
  color: #000;
  background-color: yellow;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="c-modal-request">


  <div class="c-modal-request__content">

    <a href="#" class="c-modal-request__btn-close js-modal-request-close">Close ME</a>

    <h1>HTML Ipsum Presents</h1>

    <p><strong>Pellentesque habitant morbi tristique</strong> senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. <em>Aenean ultricies mi vitae est.</em>        Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, <code>commodo vitae</code>, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci,
      sagittis tempus lacus enim ac dui. <a href="#">Donec non enim</a> in turpis pulvinar facilisis. Ut felis.</p>

  </div>

</div>

Additional : About closing div while click outside you need to look at Use jQuery to hide a DIV when the user clicks outside of it

Upvotes: 1

entis
entis

Reputation: 309

You have to check if the element you clicked is really .js-modal-request-close or a descendant:

$(".js-modal-request-close").on("click", function(e) {

    if (e.target !== this)
        return;

    $(".c-modal-request").hide();
});

Upvotes: 0

Related Questions