localStorage SET 仅一天

localStorage SET for just one day

提问人:DanG 提问时间:3/23/2020 最后编辑:CerbrusDanG 更新时间:3/24/2020 访问量:1528

问:

我需要放一个弹出窗口。它将每天更新,因此如果用户访问网站(新用户甚至以前访问过的用户),弹出窗口需要每天在页面加载时显示,但如果用户点击通知,则需要在重置之前保持隐藏 24 小时。我已经编写了这段代码,但无法使用 localStorage 让它与上次显示时进行比较。

  var modal = document.querySelector(".opening-modal");
  var close = document.getElementById("pageDiv");
  var element = document.getElementById("pageDiv");

    function popupShown() {
        if (!localStorage.getItem('showPopup')) { //check if popup has already been shown, if not then proceed
            localStorage.setItem('showPopup', 'true'); // Set the flag in localStorage
            element.classList.add("show-modal");
        }
    }
    function closeModal() {
        element.classList.add("hide-modal");
    }
    window.setTimeout(popupShown, 1500);
    window.addEventListener("click", closeModal);
JavaScript 模态对话框 弹出窗口

评论


答:

0赞 T.J. Crowder 3/23/2020 #1

我会给每个模态一个 ID(升序),并存储用户关闭的最后一个模态的 ID。这样,如果模态在 48 小时(而不是 24 小时)内没有更改,则不会再次向用户显示模态。

var popupId = 42; // This is the number that changes when the content changes
if (+localStorage.dismissedPopup !== popupId) {
    // Either the user has never dismissed one of these, or it's not the most recent one
    window.setTimeout(popupShown, 1500);
}
function closeModal() {
    element.classList.add("hide-modal");
    // Remember the ID of the most recent modal the user dismissed
    localStorage.dismissedPopup = popupId;
}

如果要从 HTML 驱动此内容,则 ID 可以来自属性:data-*

<div id="pageDiv" data-popup-id="42">An important update about...</div>

然后:

var popupId = +element.getAttribute("data-popup-id");

但是,如果您希望它是基于时间的,请存储上次关闭的时间:

if (!localStorage.lastPopupDismissed ||
    (Date.now() - localStorage.lastPopupDismissed) > (24 * 60 * 60 * 1000))) {
    window.setTimeout(popupShown, 1500);
}
function closeModal() {
    element.classList.add("hide-modal");
    // Remember the ID of the most recent modal the user dismissed
    localStorage.lastPopupDismissed = Date.now();
}

评论

0赞 DanG 3/23/2020
这将被添加到我的自定义 Wordpress 主题中,以便客户端更新文本,因此我不希望他们必须访问 javascript。理想情况下,我只希望本地存储与上一组进行比较,并在超过 24 小时后再次显示。
0赞 T.J. Crowder 3/23/2020
@DanG - 上面的第二个将做到这一点。(我们还可以比较文本,而不是第一个中的 ID。