如何解决两个JavaScript函数冲突,实现弹窗的条件化显示逻辑?
我明白你的问题了——现在的问题出在两个独立的逻辑互相冲突:第二个检查pageTitle的代码不管Cookie是否存在,都会强制给body加上show-alert类,直接覆盖了第一个逻辑的结果。咱们把这两个条件整合到同一个判断里,就能实现你想要的效果:只有当Cookie不存在,且页面标题包含"Test"时,才显示弹窗。
问题根源拆解
你原来的代码是两个独立执行的块:
- 页面加载时检查Cookie,决定是否隐藏弹窗
- 单独检查pageTitle,只要是Test页面就强制显示弹窗
这就导致哪怕Cookie已经存在(用户已经关闭过弹窗),第二个逻辑还是会触发弹窗显示,完全忽略了Cookie的状态。
修复后的完整代码
把两个条件合并到页面加载的回调函数里,让逻辑连贯起来:
$(window).on("load", function (e) { $('.preloader').fadeOut('slow'); // 先把两个条件的结果存为变量,让代码更清晰 const isTestPage = "@pageTitle".indexOf("Test") !== -1; const hasDismissedCookie = document.cookie.includes("isDismissed=true"); if (hasDismissedCookie) { // Cookie存在:用户已经关闭过弹窗,直接隐藏弹窗容器 document.body.classList.add("alert-container"); // 这里注意类名,原代码的"alert.container"可能是笔误,类名本身不该带点 } else { // Cookie不存在:再判断是否是Test页面 if (isTestPage) { // 是Test页面:显示弹窗 document.body.classList.add("show-alert"); } else { // 不是Test页面:不做弹窗相关操作(或根据需求添加隐藏类) // document.body.classList.add("alert-container"); } } });
关键逻辑说明
- 先判断Cookie状态:如果用户已经关闭过弹窗(存在
isDismissed=true的Cookie),直接执行隐藏弹窗的逻辑,不再往下判断页面标题。 - Cookie不存在时再检查页面标题:只有当用户没关闭过弹窗,且当前是Test页面时,才显示弹窗。
额外注意事项
- 确保关闭弹窗的函数正确设置Cookie,尤其是要指定
path=/(全站有效),避免不同页面读取不到Cookie:$(".dismiss-btn").on("click", function() { // 设置有效期为30天的全站Cookie document.cookie = "isDismissed=true; expires=" + new Date(Date.now() + 30*24*60*60*1000).toUTCString() + "; path=/"; // 隐藏弹窗 document.body.classList.remove("show-alert"); document.body.classList.add("alert-container"); }); - 检查你的类名:原代码里的
alert.container大概率是笔误,CSS类名本身不应该包含点,建议改成alert-container这类格式,避免样式不生效。
内容的提问来源于stack exchange,提问作者orriioon
相关产品推荐
相关产品推荐

