javascript - 基于窗口本地存储的倒计时定时器
问题描述
我正在开发一个简单的 Electron 应用程序项目。到目前为止,我只处于 Javascript 和 HTML 阶段。我正在制作一个倒数计时器,用户可以在其中输入未来的日期——例如他们的生日——然后应用程序会显示一个计数器,其中包含剩余的天数、小时、分钟和秒数。一开始您只看到输入字段,然后一个简单的切换功能会删除输入字段并调出一个大时钟。
到目前为止,我有一个具有基本样式的工作原型。但是每次你提出这个原型时,它都需要一个新的输入。如果我能让窗口本地存储工作,那么我会得到一个网站(因此是 Electron 应用程序),即使在关闭时也会记住你的特殊日期。
我在下面的编码尝试失败(参见标题为“本地存储问题”的大写字母)取自各种 youtube 教程和 StackOverflow 问题。但我想我错过了一个相当基本的原则以使其发挥作用。
所有建议将不胜感激。谢谢。
<script type="text/javascript" src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script type="javascript" src="p5.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<script>
// Event listener made to work with Materialize's .hide class
let hideInput = document.getElementById('input-hide');
// console.log(hideInput);
let hideCountdown = document.getElementById('countdown-hide');
// console.log(hideCountdown);
let button = document.querySelector("button");
// console.log(button);
button.addEventListener('click', () => {
if (hideInput.classList.contains("hide")) {
hideInput.classList.remove("hide");
hideCountdown.setAttribute("class", "hide")
} else {
hideInput.setAttribute("class", "hide");
hideCountdown.classList.remove("hide");
}
});
// Find the user's input
const Calender = document.querySelector('.datepicker');
M.Datepicker.init(Calender, {
format: 'yyyy-mm-dd',
firstDay: 1,
// minDate: '15 05 2021', <-- I could't get this to work...
})
// Create a countdown timer and display the user's text
function enterSpecialDate() {
let userDate = new Date(document.getElementById('special-date').value);
// console.log(userDate);
let currentTime = new Date();
/////// LOCAL STORAGE PROBLEM ///////
// window.localStorage.setItem("storedObject", userDate.value);
// console.log(storedObject);
// console.log(dtUserDate);
// let diff = storedObject - currentTime;
let diff = userDate - currentTime;
/* we've been given the difference in milliseconds, so some division is needed */
const d = Math.floor(diff / 1000 / 60 / 60 / 24);
const h = Math.floor(diff / 1000 / 60 / 60) % 24;
const m = Math.floor(diff / 1000 / 60) % 60;
const s = Math.floor(diff / 1000) % 60;
/* send values back into HTML document */
document.getElementById('days').innerHTML = d;
document.getElementById('hours').innerHTML = h;
document.getElementById('minutes').innerHTML = m;
document.getElementById('seconds').innerHTML = s;
// console.log(s < 10 ? ‘0’ + s : s;) <-- I could't get this to work...
/*collect user's special occasion and send back into document*/
var userOccasion = document.getElementById('user-occasion').value;
document.getElementById('userOccasionOutput').innerHTML = userOccasion;
console.log(document.getElementById('user-occasion').value);
}
setInterval(enterSpecialDate, 1000);
<body>
<div class="container">
<!-- welcome message and input area - should show on start then dissappear after you click buttton-->
<div class="" id="input-hide">
<div class="row">
<div class="col s12 m12 distance-1"></div>
<div class="col s12 m3"></div>
<div class="col s12 m6">
<h2>
Countdown to your special occasion!
</h2>
</div>
<div class="col s12 m3"></div>
</div>
<div class="row">
<div class="col s12 m3"></div>
<div class="col s12 m6">
<form action="">
<div class="input-field">
<textarea class="materialize-textarea" name="user-occasion" id="user-occasion"
placeholder="e.g. my birthday"></textarea>
<label for="user-occasion">what is your special occasion?</label>
</div>
</form>
</div>
<div class="col s12 m3"></div>
</div>
<div class="row">
<div class="col s12 m3"></div>
<div class="col s12 m6">
<form action="">
<div class="input-field">
<input type="text" id="special-date" class="datepicker" placeholder="click here">
<label for="date">when is your special occasion?</label>
</div>
</form>
<button onclick="enterSpecialDate()">Enter</button>
</div>
<div class="col s12 m3"></div>
</div>
</div>
<!-- countdown ticker - should appear only after you click the button -->
<div class="hide" id="countdown-hide">
<div class="row">
<div class="col s12 m12 distance-2">
<p></p>
</div>
<div class="col s12 m12">
<div class="time col s12 m3">
<span class="number" id="days"></span>
<br>
<span id="unit">days</span>
</div>
<div class="time col s12 m3">
<span class="number" id="hours"></span>
<br>
<span id="unit">hours</span>
</div>
<div class="time col s12 m3">
<span class="number" id="minutes"></span>
<br>
<span id="unit">minutes</span>
</div>
<div class="time col s12 m3">
<span class="number" id="seconds"></span>
<br>
<span id="unit">seconds</span>
</div>
<!-- <div class="time col s12 m3"></div> -->
</div>
<div class="col s12 m12 distance-3"></div>
<div class="col s12 m12">
<div class="time col s12 m12 until">
<span>until </span><span id="userOccasionOutput"></span></p>
</div>
<div class="col s12 m12">
<a href="javascript:location.reload(true)">start again</a>
</div>
</div>
</div>
</div>
</div>
</div>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
<link href='https://fonts.googleapis.com/css?family=Poppins' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="css/DatePicker1.css">
解决方案
我真的没有看到问题。
我刚刚为“促销”制作了类似的东西。
我没有测试过你的代码,但是为了让它使用 localStorage 工作,我会并且做了这样的事情:
在检查 localStorage 是否没有该项目后,检索用户输入ONCE 。
if (!localStorage.getItem('birthday_key_HASH')) // Retrieve user's input and then store it. let userDate = new Date(document.getElementById('special-date').value); localStorage.setItem('birthday_key_HASH', userDate);
如果已经设置,只需使用用户生日值进行数学计算。
// ...Do your calculus. userBirthdayDate = localStorage.getItem('birthday_key_HASH');
让我知道这是否足够清楚。
推荐阅读
- python - R-Squared、MSE、MAE 作为模型评估技术来比较回归结果
- java - 作为 JPackage 安装的一部分,如何在 linux 中使本机 linux 应用程序可执行
- django - 使用从相关模型中过滤的 id 列表过滤模型中的数据
- javascript - 如何从嵌套在js对象数组中的数组中删除sessionID:null值对象
- node.js - React Typescript SSR 与 monorepo 项目结构
- android - 使用方向调整安卓手机屏幕亮度
- azure - React-Native 上的 Azure 室内地图
- linq - 使用 sort 参数按对象属性对列表进行排序
- python - 如何将 Spacy en_core_web_md 模型放入 Python 包中
- php - 如何使用php检查变量是否包含一组字符