如何将模态 window jQuery 重写为原生 Javascript?

How can I rewrite modal window jQuery into native Javascript?

如何将模态 windows 的 jQuery 代码重写为本机 Javascript? 保存和使用数据属性很重要。

我无法同时使用 forEach 和 getAttribute 编写代码。我总是使用 jQuery 编写代码,现在我必须使用原生 JavaScript.

编写代码

$('[data-modal]').click(function () {
    var target = $(this).attr('data-modal');

    if (target == 'close') $('.modal-container').removeClass('active');
    else                   $('.modal-container' + target).addClass('active');
    
});
body {
  padding: 50px;
}
.btn-group .btn {
  display: inline-block;
  padding: 10px 20px;
  background-color: #2980b9;
  color: #fff;
  cursor: pointer;
  user-select: none;
  -webkit-user-select: none;
  -moz-user-select: none;
}
.modal-container {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  opacity: 0;
  visibility: hidden;
  transition: all 0.3s ease;
}
.modal-container.active {
  opacity: 1;
  visibility: visible;
}
.modal-container .overlay {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  background-color: rgba(0, 0, 0, 0.7);
  z-index: 1;
}
.modal-container .modal {
  position: relative;
  z-index: 2;
  background-color: #fff;
  padding: 30px;
  border-radius: 3px;
  max-width: 600px;
  margin: 50px auto;
}
    <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="css/style.css">
    <title>Modal example</title>
</head>
<body>

    <div class="page-content">
        <div class="btn-group">
            <a class="btn" data-modal="#m1">Open modal 1</a>
            <a class="btn" data-modal="#m2">Open modal 2</a>
            <a class="btn" data-modal="#m3">Open modal 3</a>
        </div>
    </div>

    <div id="m1" class="modal-container">
        <div class="overlay" data-modal="close"></div>
        <div class="modal">
            <h2>Modal window title</h2>
            <p>1 Lorem, ipsum dolor sit amet consectetur adipisicing elit. Cupiditate ab praesentium itaque temporibus beatae nobis impedit similique, magni facere quam aperiam quos quisquam atque vero, aliquid voluptas perferendis. Eius, tenetur!</p>
            <button data-modal="close">Close window</button>
        </div>
    </div>
    <div id="m2" class="modal-container">
        <div class="overlay" data-modal="close"></div>
        <div class="modal">
            <h2>Modal window title</h2>
            <p>2 Lorem, ipsum dolor sit amet consectetur adipisicing elit. Cupiditate ab praesentium itaque temporibus beatae nobis impedit similique, magni facere quam aperiam quos quisquam atque vero, aliquid voluptas perferendis. Eius, tenetur!</p>
            <button data-modal="close">Close window</button>
        </div>
    </div>
    <div id="m3" class="modal-container">
        <div class="overlay" data-modal="close"></div>
        <div class="modal">
            <h2>Modal window title</h2>
            <p>3 Lorem, ipsum dolor sit amet consectetur adipisicing elit. Cupiditate ab praesentium itaque temporibus beatae nobis impedit similique, magni facere quam aperiam quos quisquam atque vero, aliquid voluptas perferendis. Eius, tenetur!</p>
            <button data-modal="close">Close window</button>
        </div>
    </div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<script src="js/main.js"></script>
</body>
</html>

非常感谢您的帮助!

试一试

document.addEventListener("click", function(e) {
  const tgt = e.target;
  if (tgt.classList.contains("btn")) {
    document.querySelector(tgt.dataset.modal).classList.add('active')
  } else if (tgt.classList.contains("overlay") || tgt.classList.contains("close")) {
    tgt.closest('.modal-container').classList.remove('active')
  }
});

document.addEventListener("click", function(e) {
  const tgt = e.target;
  if (tgt.classList.contains("btn")) {
    document.querySelector(tgt.dataset.modal).classList.add('active')
  } else if (tgt.classList.contains("overlay") || tgt.classList.contains("close")) {
    tgt.closest('.modal-container').classList.remove('active')
  }
});
body {
  padding: 50px;
}

.btn-group .btn {
  display: inline-block;
  padding: 10px 20px;
  background-color: #2980b9;
  color: #fff;
  cursor: pointer;
  user-select: none;
  -webkit-user-select: none;
  -moz-user-select: none;
}

.modal-container {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  opacity: 0;
  visibility: hidden;
  transition: all 0.3s ease;
}

.modal-container.active {
  opacity: 1;
  visibility: visible;
}

.modal-container .overlay {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  background-color: rgba(0, 0, 0, 0.7);
  z-index: 1;
}

.modal-container .modal {
  position: relative;
  z-index: 2;
  background-color: #fff;
  padding: 30px;
  border-radius: 3px;
  max-width: 600px;
  margin: 50px auto;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="page-content">
  <div class="btn-group">
    <a class="btn" data-modal="#m1">Open modal 1</a>
    <a class="btn" data-modal="#m2">Open modal 2</a>
    <a class="btn" data-modal="#m3">Open modal 3</a>
  </div>
</div>

<div id="m1" class="modal-container">
  <div class="overlay" data-modal="close"></div>
  <div class="modal">
    <p>1 Lorem, ipsum dolor sit amet consectetur adipisicing elit. Cupiditate ab praesentium itaque temporibus beatae nobis impedit similique, magni facere quam aperiam quos quisquam atque vero, aliquid voluptas perferendis. Eius, tenetur!</p><button class="close" data-modal="close">Close window</button>
  </div>
</div>
<div id="m2" class="modal-container">
  <div class="overlay" data-modal="close"></div>
  <div class="modal">
    <p>2 Lorem, ipsum dolor sit amet consectetur adipisicing elit. Cupiditate ab praesentium itaque temporibus beatae nobis impedit similique, magni facere quam aperiam quos quisquam atque vero, aliquid voluptas perferendis. Eius, tenetur!</p><button class="close" data-modal="close">Close window</button>
  </div>
</div>
<div id="m3" class="modal-container">
  <div class="overlay" data-modal="close"></div>
  <div class="modal">
    <p>3 Lorem, ipsum dolor sit amet consectetur adipisicing elit. Cupiditate ab praesentium itaque temporibus beatae nobis impedit similique, magni facere quam aperiam quos quisquam atque vero, aliquid voluptas perferendis. Eius, tenetur!</p><button class="close" data-modal="close">Close window</button>
  </div>
</div>