【问题标题】:Making elements unaccessible by date (for an advent calendar)使元素无法按日期访问(用于出现日历)
【发布时间】:2020-11-05 18:00:31
【问题描述】:

我最近一直在使用 vanilla JS 而没有 jquery 或使用网格(就像我在网上看到的所有示例一样)制作一个降临节日历。 我似乎无法根据日期打开门。我认为 js 代码或多或少是正确的,但我错过了实际上为每个 html 元素(门)提供了在 JS 文件中检查的日期的变量。 所以我的问题是,我错过了什么?在 html 中添加“day”类是否有效? 我还没有找到一个只有香草 JS 的样本,所以我很迷茫。

我制作了一个非常简单的代码笔,其中包含四个不同日期的门元素。实际项目有 25 扇门,它们都随机放置在背景上。他们也没有使用警报,但为了显示某些内容,我已将其更改为警报!

如果内容草率或难以阅读,我深表歉意;我对此还是很陌生。

如果您需要任何澄清,请在 cmets 中告诉我!

谢谢!

代码笔: https://codepen.io/LovelyAndy/pen/MWebWKy

let d = new Date()
let todaysDate = d.getDate()
const chirstmas = new Date('2020-12-25')
const day = document.querySelectorAll('.day')
const doors = document.querySelectorAll('.door')
const doorBackArray = document.querySelectorAll('.door-back')

doors.forEach((door) => {
  if (todaysDate >= day) {
    door.addEventListener('click', () => {
      door.classList.add('doorOpen')
    })
  } else if (todaysDate < day) {
    door.addEventListener('click', function() {
      alert("Not so fast! Come back on the day for the surprise!");
    })
  } else {
    door.addEventListener('click', function() {
      alert("It's Christmas baby!");
    })
  }
})
.door-position {
  position: absolute;
}

.door-back {
  position: relative;
  height: 65px;
  width: 65px;
  background-image: url('https://preview.redd.it/npq2ab6aepd51.jpg?auto=webp&s=2d44bf582509451d41f9e8add54775e9fb4478fb');
  border-radius: 50px;
  background-size: cover;
}

.door {
  position: absolute;
  height: 65px;
  width: 65px;
  font-family: 'Mountains of Christmas', cursive;
  font-size: 1.5em;
  color: white;
  border: 2px solid teal;
  border-radius: 50px;
  background: indianred;
  cursor: pointer;
  transform-origin: left;
  transition: all 0.5s ease-in-out;
}

.doorOpen {
  transform: perspective(1200px) translateZ(0px) translateX(0px) translateY(0px) rotateY(-150deg);
}

.d1 {
  top: 100px;
  left: 60px;
}

.d10 {
  top: 100px;
  left: 400px;
}

.d20 {
  top: 100px;
  left: 600px;
}

.d25 {
  top: 100px;
  left: 800px;
}
<div class="calendar-main">
  <div class="door-position d1">
    <div class="door-back">
      <button class="door day">1</button>
    </div>
  </div>
  <div class="door-position d10">
    <div class="door-back">
      <button class="door day">10</button>
    </div>
  </div>
  <div class="door-position d20">
    <div class="door-back">
      <button class="door day">20</button>
    </div>
  </div>
  <div class="door-position d25">
    <div class="door-back">
      <button class="door day">25</button>
    </div>

  </div>

【问题讨论】:

  • 我给你做了一个sn-p。我不得不将 }) 移到 alert("It's Christmas baby!"); }) 之后
  • 并从const day = document.querySelectorAll.('.day')中删除一个点
  • 您可能还想拼写chirstmas christmas
  • @mplungjan 感谢您的更正!不幸的是,他们现在都在点击时显示警报。我将最后的 else 更改为“else if”并成功了(todaysDate === 圣诞节),现在没有任何效果

标签: javascript date if-statement calendar addeventlistener


【解决方案1】:

您可以使用 html data attributes 来指定每个元素的开放日期。 然后,您将使用标准元素选择器获取该日期,然后引用它的数据属性。

<div class="door-position d1" data-opening-date="12/25/2020">
    <div class="door-back">
      <button class="door day">1</button>
    </div>
  </div>

然后您可以从数据属性中获取点击日期:

const door = document.querySelector('.door-back');
if (door.openingDate == myDate) { do something }

你可以看到一个完整的实现here。

【讨论】:

  • 有趣!首先感谢您的回复!所以我在 html 上经历了 25 天中的每一天,添加 data 属性,然后在 js 代码中,我可以纠正如下内容:code let todaysDate = d.getDate() let myDates = document.querySelectorAll('data-opening-date') doors.forEach((door) =&gt;{ if (todaysDate === myDates) { alert("SOMETHING!") } }) 我觉得我为 data-opening-dates 放置的变量不是虽然正确。感谢所有帮助!
  • 您将遍历所有门,然后检查数据开放日期,而不是查询具有此数据属性的所有元素。 const door = document.querySelectorAll('.door') door.forEach((door) => { door.dataOpeningDate == todaysDate }) 注意:要访问数据属性,您必须使用驼峰式大小写。
  • 再次感谢您的回复。即使在做door.dataset.openingDate === todaysDate 时我也遇到了一些麻烦,就像它在 MDN 上列出的那样。也许有一些奇怪的情况使它不适用于 if 语句,但我会继续搞砸它!
  • @LovelyAndy 您需要在比较之前将日期转换为字符串,控制台记录两个值以查看它们是否匹配。
猜你喜欢
  • 2021-09-17
  • 2021-12-20
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 2018-09-04
相关资源
最近更新 更多