使用 cookie 控制弹出模式

Control popup modal with cookies

我正在尝试使用 cookie 控制弹出模式的行为。理想情况下,功能如下: 页面加载后约 3 秒弹出模式。如果用户关闭弹出模式,则会创建一个最长 2 天的 cookie(出于测试目的,我使用 30 秒的增量)。逻辑是,如果 cookie 不存在,即当它过期时,'show' 的 class 将被添加到模式中,使其再次出现。首先,我根本无法让它工作。第二个问题是让模式首先出现。我最初的想法是设置一个计时器,但每次用户导航或刷新时它都会一直出现。然后我尝试添加一个 cookie 以使用事件侦听器“DOMConentLoaded”初始设置 class,但这给了我同样的问题。我是 cookie 的新手,正在学习如何使用它们。有任何想法吗?非常感谢!

<div id="popup" class="popup grid u-bgColorPrimary">
    <div class="grid__col--7">
        <h1>New Popup</h1>
    </div>
    <div class="grid__col">
        <div id="close" class="popup__close"></div>
        <img src="<?php echo get_template_directory_uri() . '/lib/images/careers-bg.png'; ?>" alt="">
    </div>
</div>
let popup = document.getElementById("popup");
let close = document.getElementById("close");

// Timer for Popup modal
// setTimeout(() => {
//   popup.classList.add("popup--show");
// }, 3000);

close.addEventListener("click", () => {
  popup.classList.remove("popup--show");
});

document.addEventListener("DOMContentLoaded", () => {
  let key = "initiate_cookie";
  let value = encodeURIComponent("show_popup");
  let age = 15;
  let cookie = document.cookie = `${key}=${value};path=/;max-age=${age};`

  if (cookie) {
    popup.classList.add("popup--show");
  } else {
    popup.classList.remove("popup--show")
  }
});

document.getElementById("close").addEventListener("click", (ev) => {
  let key = "popup_display";
  let value = encodeURIComponent("show");
  let age = 30;

  document.cookie = `${key}=${value};path=/;max-age=${age};`;
  let cookie = document.cookie = `${key}=${value};path=/;max-age=${age};`


  if (!cookie) {
    popup.classList.add("popup--show");
  } else {
    popup.classList.remove("popup--show");
  }
});

在决定是否显示弹出窗口之前,请先获取 cookie。计时器是个好主意,但您需要知道是否需要启动计时器。

检查cookie是否存在。如果尚未设置 cookie,则 运行 计时器并显示弹出窗口。每当弹出窗口关闭时,设置 cookie。

下次加载页面时,它将再次评估是否已设置 cookie,但现在应该已设置,因此计时器不会 运行 并且弹出窗口不会显示。

每当 cookie 过期并再次加载页面时,弹出窗口将再次显示。

下面的示例演示了此行为。

// Returns the cookie value or null.
const getCookie = name => {
  const nameExpression = `${name}=`;
  const cookies = document.cookie.split(';');
  const cookie = cookies.find(currentCookie => currentCookie.includes(nameExpression));  
  return cookie ? cookie.trim().substring(nameExpression.length, cookie.length) : null;
}

// Sets the cookie.
const setCookie = (name, value, expire = 365, path = '/') => {
  const date = new Date();
  date.setTime(date.getTime() + (expire * 24 * 3600 * 1000));
  const expires = date.toUTCString();
  document.cookie = `${name}=${value}; expires=${expires}; path=${path}`;
};

const popup = document.getElementById("popup");
const close = document.getElementById("close");

// Define the name of the cookie.
cookieName = "popup-display";

// First get the cookie..
const cookie = getCookie(cookieName);

// ..then check if the cookie is not set.
if (cookie !== 'show') {

  // If it isn't set, show the popup after 3 seconds..
  setTimeout(() => {
    popup.classList.add("popup--show");
  }, 3000);

  // ..and add the event listener.
  close.addEventListener("click", (event) => {
    
    // Set the cookie with the value show for 2 days..
    setCookie(cookieName, "show", 2);

    // ..and hide the popup
    popup.classList.remove("popup--show");
  });
}

当前的 setCookie 函数以天为单位设置时间。为了帮助调试,请使用下面以秒为单位设置时间的函数。

const setShortCookie = (name, value, seconds, path = '/') => {
  const date = new Date();
  date.setTime(date.getTime() + (seconds * 1000));
  const expires = date.toUTCString();
  document.cookie = `${name}=${value}; expires=${expires}; path=${path}`;
};