在Javascript中打开各种按钮的相应弹出窗口

时间:2017-07-26 06:56:48

标签: javascript jquery html

我的HTML文件有许多图标图像(所有图像具有相同的类属性)和表示模态/弹出窗口的相同数量的HTML片段(它们也具有相同的类名)。图标和弹出片段总是成对出现并动态生成,这意味着对的确切数量是未知的。我的HTML代码看起来像这样 -

<img src="/images/info_icon.gif" class="tooltip_icon" alt="sample">
<div class="tooltip_modal">
  <div class="modal-content">
    <div class="modal-header">
      <span class="close">&times;</span>
      <h5>Tooltip</h5>
    </div>
    <div class="modal-body">
      <p>Sample text 1</p>
    </div>
  </div>
</div>

<img src="/images/info_icon.gif" class="tooltip_icon" alt="sample">
<div class="tooltip_modal">
  <div class="modal-content">
    <div class="modal-header">
      <span class="close">&times;</span>
      <h5>Tooltip</h5>
    </div>
    <div class="modal-body">
      <p>Sample text 2</p>
    </div>
  </div>
</div>

<img src="/images/info_icon.gif" class="tooltip_icon" alt="sample">
<div class="tooltip_modal">
  <div class="modal-content">
    <div class="modal-header">
      <span class="close">&times;</span>
      <h5>Tooltip</h5>
    </div>
    <div class="modal-body">
      <p>Some text 3</p>
    </div>
  </div>
</div>

请注意,每种模态的文字都不同。 我想在JavaScript中创建一个逻辑,单击该图标可打开相应的模型。例如 - 单击第一个图标应显示&#34;示例文本1&#34; ,单击第二个图标应显示&#34;示例文本2&#34;。

以下是我的JS代码(显然)不起作用:

var btn = document.getElementsByClassName("tooltip_icon");
var modal = document.getElementsByClassName("tooltip_modal");


// Get the <span> element that closes the modal
var span = document.getElementsByClassName("close")[0];

// When the user clicks the button, open the modal 
function displayModal(k) {
    modal[k].style.display = "block";
}

// When the user clicks on <span> (x), close the modal
function hideModal(k) {
    modal[k].style.display = "none";
}

for (var i=0,j=0; i<btn.length,j<modal.length; i++,j++) {

    btn[i].onclick = displayModal(j);
    span.onclick = hideModal(j);
    window.onclick = function(event) {
    if (event.target == modal[j]) {
        hideModal(j);
    }
}
}

我在这里尝试做的是循环浏览所有图标和模态以及我试图调用icon[i]的每个modal[j]

Jsfiddle代码 - https://jsfiddle.net/2orwct27/

请帮忙! 提前致谢

1 个答案:

答案 0 :(得分:0)

好,

您的代码中存在一些问题。我重写了整个代码,以便您了解代码中的错误以及您的解决方案的外观。

请记住,我写的内容使用的语言功能并非所有浏览器都支持。但在现代浏览器中,它运行良好。

&#13;
&#13;
function openWindow(modal) {
	modal.style.display = 'block';
	setTimeout(() => { document.addEventListener('click', closeModal); });
}

function closeWindow(modal) {
	modal.style.display = 'none';
	setTimeout(() => { document.removeEventListener('click', closeModal); });
}

function closeModal(e) {
	const modal = getModalRoot(e.target);
	if (modal) return;
	
	[].forEach.call(document.querySelectorAll('.tooltip_modal'), closeWindow);
}

function getModalRoot(element) {
	if (!element || !element.classList) return null;
	if (element.classList.contains('modal-content')) return element;
	return getModalRoot(element.parentNode);
}

[].forEach.call(document.querySelectorAll('.tooltip_icon'), (x, i) => {
	x.id = `opener${i}`;	
	const modal = x.querySelector(`#${x.id} ~ .tooltip_modal`);
	
	x.addEventListener('click', () => { openWindow(modal); });	
	modal.querySelector('.close').addEventListener('click', () => { closeWindow(modal); });
});
&#13;
/* The Modal (background) */
.tooltip_modal {
    display: none; /* Hidden by default */
    position: fixed; /* Stay in place */
    z-index: 1; /* Sit on top */
    padding-top: 100px; /* Location of the box */
    left: 0;
    top: 0;
    width: 100%; /* Full width */
    height: 100%; /* Full height */
    overflow: auto; /* Enable scroll if needed */
    background-color: rgb(0,0,0); /* Fallback color */
    background-color: rgba(0,0,0,0.4); /* Black w/ opacity */
}

/* Modal Content */
.modal-content {
    position: relative;
    background-color: #fefefe;
    margin: auto;
    padding: 0;
    border: 1px solid #888;
    width: 80%;
    box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19);
    -webkit-animation-name: animatetop;
    -webkit-animation-duration: 0.4s;
    animation-name: animatetop;
    animation-duration: 0.4s
}

/* Add Animation */
@-webkit-keyframes animatetop {
    from {top:-300px; opacity:0} 
    to {top:0; opacity:1}
}

@keyframes animatetop {
    from {top:-300px; opacity:0}
    to {top:0; opacity:1}
}

/* The Close Button */
.close {
    color: white;
    float: right;
    font-size: 28px;
    font-weight: bold;
}

.close:hover,
.close:focus {
    color: #000;
    text-decoration: none;
    cursor: pointer;
}

.modal-header {
    padding: 2px 16px;
    background-color: #425563;
    border-bottom: 4px solid #ffd100;
    color: white;
}

.modal-body {padding: 10px 16px;}

.modal-footer {
    padding: 2px 16px;
    background-color: #5cb85c;
    color: white;
}

/* Tooltip icon*/
.tooltip_icon
    {
        padding-bottom: 4px;
        padding-left: 2px;
    }
&#13;
<img src="/images/info_icon.gif" class="tooltip_icon" alt="sample">
<div class="tooltip_modal">
  <div class="modal-content">
    <div class="modal-header">
      <span class="close">&times;</span>
      <h5>Tooltip</h5>
    </div>
    <div class="modal-body">
      <p>Sample text one</p>
    </div>
  </div>
</div>

<img src="/images/info_icon.gif" class="tooltip_icon" alt="sample">
<div class="tooltip_modal">
  <div class="modal-content">
    <div class="modal-header">
      <span class="close">&times;</span>
      <h5>Tooltip</h5>
    </div>
    <div class="modal-body">
      <p>Sample text 2</p>
    </div>
  </div>
</div>

<img src="/images/info_icon.gif" class="tooltip_icon" alt="sample">
<div class="tooltip_modal">
  <div class="modal-content">
    <div class="modal-header">
      <span class="close">&times;</span>
      <h5>Tooltip</h5>
    </div>
    <div class="modal-body">
      <p>Some text 3</p>
    </div>
  </div>
</div>
&#13;
&#13;
&#13;

首先,我没有改变任何HTML或CSS。

有什么不同

不是通过所有图像和模态元素循环并更改html,而是可以为图像和每个关闭元素添加EventListener

对于显示和隐藏模态的功能,它现在获得模态本身而不是它的索引。

在您的代码中,如果点击目标等于模型,则单击“检查”。如果是这样,它应该关闭它。但是在您的代码中的评论中,您反而意味着它。因为我猜这是自然行为,这就是我在剪辑中实现的方式。