【问题标题】:How can I make a dialog for each of multiple divs?如何为多个 div 中的每一个创建一个对话框?
【发布时间】:2017-11-11 12:10:53
【问题描述】:

我正在尝试制作一个小型仪表板,我可以每天早上检查它,以便我可以轻松地判断前一天晚上是否发生了故障。基本思想是每行有 2 个 flex div。

我不经常使用 HTML 或 JavaScript。我试图使用纯 JS 使 div 看起来像一个弹出窗口,但我遇到了 z-index 和 flex div 的问题,所以我尝试使用一些 JQuery 来让事情变得更容易。

这个想法是每个块都隐藏了一个包含更多信息的“详细信息”div。单击这些框应该将该 div 的测试显示为对话框。

我可以让一个工作正常。我的问题是尝试初始化所有对话框,以便我可以在闲暇时单击打开它们。在阅读了如何properly initialize dialogs 之后,我尝试实现它。

我的问题是我没有得到任何回应或反馈,所以我不知道我做错了什么。

$(document).ready(function() {
  // Initialize all of the dialogs on this page
  $('.details').each(function() {
    $(this).dialog({
      autoOpen: false,
      width: 450,
      height: 550,
      buttons: {
        blah: function() {
          $(this).dialog("close");
        }
      }
    });
  });

  // Capture click event on all job class tables.
  $('.flex-item').click(function() {
    // look for a child element with the details class and opens its dialog
    $(this).find('.details').dialog('open');
  });
});
#container {
  width: 1050px;
  display: flex;
  flex-flow: row wrap;
  justify-content: space-around;
  align-content: flex-start;
}

#container .flex-item {
  background: tomato;
  padding: 5px;
  width: 500px;
  height: 80px;
  margin-top: 10px;
  z-index: 500;
  cursor: default;
}

.flex-item .job {
  font-weight: bold;
  font-size: 1.3em;
  color: white;
}

.flex-item .dataGood,
.dataBad {
  font-weight: bold;
  font-size: 2em;
  text-align: center;
}

.flex-item .details {
  background-color: white;
  visibility: hidden;
  background-color: #555;
  color: #fff;
  text-align: center;
  border-radius: 6px;
  padding: 8px 0;
  position: absolute;
  z-index: 10000;
  bottom: 125%;
  left: 50%;
  margin-left: -80px;
}

.flex-item .dataGood {
  background-color: green;
}

.flex-item .dataBad {
  background-color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="container">
  <div class="flex-item">
    <div class="job">Title</div>
    <div class="dataGood">Date</div>
    <div class="details">This is the hidden stuff</div>
  </div>
  <div class="flex-item">
    <div class="job">NIGHTLY WHOLE BACKUP on KANOR1</div>
    <div class="dataGood">03/08/2017 20:00:00</div>
    <div class="details">This is the hidden stuff</div>
  </div>
  <div class="flex-item">
    <div class="job">DataMaint.Full Backup on KANSAGESQL</div>
    <div class="dataGood">03/08/2017 20:00:00</div>
    <div class="details">This is the hidden stuff</div>
  </div>
  <div class="flex-item">
    <div class="job">Backup Failure Error 18204 on SQL08R2VM</div>
    <div class="dataBad">03/08/2017 20:00:00</div>
    <div class="details">This is the hidden stuff</div>
  </div>
</div>

For the fiddlers

【问题讨论】:

  • 即使我确实有一个有效的解决方法,如果有人知道为什么 Jquery 不工作,我也会欢迎这些信息。
  • 我猜你需要唯一的 ID 来解决这个问题:creating-multiple-instances-of-dialog-box ...如果这对你有帮助,我可以在我的答案中添加注释和链接
  • @LGSon 这看起来很有希望。我正忙于实施您当前的答案,但我也会对此进行查看。无论如何,我会将其添加到您的答案中。感谢所有帮助。
  • 不客气......我在我的答案中添加了该链接

标签: jquery html css jquery-ui flexbox


【解决方案1】:

我认为它对你有用:

$(this).find( ".details" ).dialog( "destroy" );
  // Capture click event on all job class tables.
  $('.flex-item').click(function() {
      $(this).find( ".details" ).dialog( "instance" );
      $(this).find( ".details" ).dialog({
          height: 400
       });
  });

【讨论】:

  • 你能解释一下这对我有什么帮助吗?我知道destroy 将元素恢复到其原始状态,所以我的 init 函数现在没用了吗? Instance 应该返回一个您不使用的对象,所以我看不到它在做什么。回答我的第一个问题可能会解释您仅在 sn-p 中设置高度的原因。
  • 我们需要设置对话框。在打开它之前,这就是为什么我给了高度,你的对话框初始化也没用
  • 我明白这一点,但我目前尝试使用$('.details').each(function() { ... 进行设置。那我不应该这样做吗?在我的示例中,您的 JS 应该替换我的吗?
【解决方案2】:

如何使用 CSS hover 和 transform

Updated fiddle

#container {
  width: 1050px;
  display: flex;
  flex-flow: row wrap;
  justify-content: space-around;
  align-content: flex-start;
  border: solid, 1px;
}
#container .flex-item {
  position: relative;
  background: tomato;
  padding: 5px;
  width: 500px;
  height: 80px;
  margin-top: 10px;
  cursor: default;
}
.flex-item .job {
  font-weight: bold;
  font-size: 1.3em;
  color: white;
}
.flex-item .dataGood,
.dataBad {
  font-weight: bold;
  font-size: 2em;
  text-align: center;
}

.flex-item .details {
  background-color: #555;
  color: #fff;
  text-align: center;
  padding: 8px 0;
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  transform: scaleY(0);
}
.flex-item .dataGood {
  background-color: green;
}
.flex-item .dataBad {
  background-color: red;
}
.flex-item:hover {
  z-index: 10;
}
.flex-item:hover .details {
  transform: scaleY(1);
}
<div id="container">
  <div class="flex-item">
    <div class="job">Title</div>
    <div class="dataGood">Date</div>
    <div class="details">This is the hidden stuff</div>
  </div>
  <div class="flex-item">
    <div class="job">NIGHTLY WHOLE BACKUP on KANOR1</div>
    <div class="dataGood">03/08/2017 20:00:00</div>
    <div class="details">This is the hidden stuff</div>
  </div>
  <div class="flex-item">
    <div class="job">DataMaint.Full Backup on KANSAGESQL</div>
    <div class="dataGood">03/08/2017 20:00:00</div>
    <div class="details">This is the hidden stuff</div>
  </div>
  <div class="flex-item">
    <div class="job">Backup Failure Error 18204 on SQL08R2VM</div>
    <div class="dataBad">03/08/2017 20:00:00</div>
    <div class="details">This is the hidden stuff</div>
  </div>
</div>

作为旁注,我更像是一个 CSS/plain javascript 人,我仍然猜想你需要独特的 id 来让你的 jQuery 对话框工作:

【讨论】:

  • 对我来说似乎是一个非常简单的解决方法。谢谢。
  • 所以 0 的 scaley 是隐藏它的原因,而 1 的 scaley 设置了 div 的正常比例,让我们可以看到它。它也出现在下面的 div 上。太棒了。
  • @Matt 没错,details 上的缩放显示/隐藏,flex-item 上的 z-index 将它们移到顶部
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 2013-09-23
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多