寻求Cookie/LocalStorage方案:实现window.onload每月仅触发一次模态框
方案一:使用 LocalStorage
LocalStorage 会持久保存数据(除非用户手动清除),我们通过存储上次弹窗的时间戳,判断当前时间与上次的间隔是否超过30天(近似一个月)来控制弹窗触发:
<script type="text/javascript"> window.onload = function () { // 检查是否需要触发弹窗 const shouldShowModal = checkIfNeedShowModal(); if (shouldShowModal) { OpenBootstrapPopup(); // 记录本次弹窗的时间戳 localStorage.setItem('lastModalShown', Date.now().toString()); } }; function checkIfNeedShowModal() { const lastShown = localStorage.getItem('lastModalShown'); if (!lastShown) { // 从未弹出过,允许触发 return true; } // 计算30天的毫秒数(30*24*60*60*1000) const thirtyDaysInMs = 2592000000; const currentTime = Date.now(); // 判断是否超过30天 return currentTime - parseInt(lastShown) > thirtyDaysInMs; } function OpenBootstrapPopup() { $("#simpleModal").modal('show'); } function myFunctionClose() { $("#simpleModal").modal('hide'); } </script>
方案二:使用 Cookie
Cookie 可以直接设置过期时间,我们将Cookie的过期时间设为30天后,页面加载时检查Cookie是否存在:
<script type="text/javascript"> window.onload = function () { // 检查名为 modalShown 的Cookie是否存在 if (!getCookie('modalShown')) { OpenBootstrapPopup(); // 设置Cookie,30天后过期 setCookie('modalShown', 'true', 30); } }; // 获取Cookie的工具函数 function getCookie(name) { const value = `; ${document.cookie}`; const parts = value.split(`; ${name}=`); if (parts.length === 2) return parts.pop().split(';').shift(); } // 设置Cookie的工具函数 function setCookie(name, value, days) { let expires = ""; if (days) { const date = new Date(); date.setTime(date.getTime() + (days*24*60*60*1000)); expires = "; expires=" + date.toUTCString(); } document.cookie = `${name}=${value || ""}${expires}; path=/`; } function OpenBootstrapPopup() { $("#simpleModal").modal('show'); } function myFunctionClose() { $("#simpleModal").modal('hide'); } </script>
说明
- 两种方案的区别:LocalStorage的数据保存在浏览器端,不会随请求发送到服务器;Cookie会在每次请求时携带到服务器(如果设置了对应的路径和域名)。
- 30天是近似一个月的取值,你可以根据需求调整天数(如果需要按自然月精确计算,需额外处理日期逻辑,日常场景30天足够)。
内容的提问来源于stack exchange,提问作者maadco42
相关产品推荐
相关产品推荐

