【问题标题】:Using cookies to not show a popup based on particular actions使用 cookie 不显示基于特定操作的弹出窗口
【发布时间】:2017-02-22 05:39:20
【问题描述】:

我目前正在使用花式框在页面加载后 2 秒的弹出窗口中提供内容。我想实现一些东西,以消除每次加载网站上的页面时弹出的烦恼。

理想情况下,如果访问者单击了花式框上的“关闭”按钮,则直到第二天才会出现弹出窗口。如果访问者点击了弹出窗口中的链接,则弹出窗口要到指定的稍后日期才会出现。

这是我目前用于弹出窗口的代码:

// fancybox arguments
$(".fancybox")
    .attr('rel', 'gallery')
    .fancybox({
        padding : 0,
        'autoDimensions': false,
        'autoSize': false,
        'width': '650', 
        'height': 'auto'
    });


// Launch fancyBox on first element
setTimeout(function(){$(".fancybox").eq(0).trigger('click');},2000)

我认为这可以使用 js cookie 来完成,但我不确定根据我尝试使用两种不同的过期时间来执行的语法如何工作。

编辑:

这是用于弹出窗口的 HTML:

<div style="display:none">
    <a class="fancybox" href="#donation-info" alt=""/></a>
    <div id="donation-info">
        <?php if (get_field('donation_box_text', 'option')){
            echo '<h2>To all our readers:</h2>';
            echo '<p>' . get_field('donation_box_text', 'option') . '</p>';
            echo '<div style="text-align:center"><a href="' . get_field('donation_link', 'option') . '" id="donate" class="donate-link" />Donate</a></div>';
        }; ?>

    </div>
</div>

根据我的猜测,我还尝试更新上述函数以包含 cookie,但无济于事:

$(document).ready(function() {
        if ($.cookie('noShowDonation')) $('.fancybox').hide();
    else {
        $("#donate").click(function() {
            // fancybox arguments
                $(".fancybox")
                    .attr('rel', 'gallery')
                    .fancybox({
                        padding : 0,
                        'autoDimensions': false,
                        'autoSize': false,
                        'width': '650', 
                        'height': 'auto'
                    });

            // Launch fancyBox on first element
                setTimeout(function(){$(".fancybox").eq(0).trigger('click');},2000)
                        $.cookie('noShowDonation', true);    
                    });
                }
            });

编辑 #2 -- 更新代码 使用下面@Rob 建议的代码,我尝试将配置添加到fancybox 以及超时,但是没有运气。这是 JS 小提琴:https://jsfiddle.net/30Lxfc6r/

【问题讨论】:

  • 嗨!你有没有想过使用单个 cookie?
  • @misterwolf,我不太确定。也许cookie不是必需的,这可以通过HTML localstorage或其他东西来完成。我愿意接受最佳实施的建议。想法?
  • 既然您已经在使用 jQuery,请查看 cookie 库 - github.com/carhartl/jquery-cookie
  • @Rob 谢谢!我已经看过了,但我什至不确定从哪里开始根据用户交互触发不同的到期日期。
  • +1 用于 DOM 存储。 Cookie 与每个 HTTP 请求一起发送:您的后端可能不关心这一点。

标签: javascript jquery cookies popup


【解决方案1】:

我已经使用基于 FancyBox 文档的 JSBin 示例更新了我的答案。 https://jsbin.com/bajocosese/edit?html,console,output http://fancyapps.com/fancybox/#docs

$(function () {
  // Define cookie name
  var cookieName = 'hide_donate';

  // Configure fancyBox
  $('.fancybox').fancybox({
      autoDimensions: false,
      autoSize: false,
      height: 'auto',
      padding: 0,
      width: 650,
      beforeLoad: function() {
        // Returning false will stop fancybox from opening
        return ! $.cookie(cookieName);
      },
      afterClose: function() {
        // Set cookie to hide fancybox for 1 day
        $.cookie(cookieName, true, { expires: 1 });
      }
  });

  // Handle donate click event
  $('a#donate').on('click', function (event) {
      event.preventDefault(); 

      // Hide fancybox and set cookie to hide fancy box for 7 days
      $.fancybox.close();
      $.cookie(cookieName, true, { expires: 7 });
  });

  // Launch fancyBox on first element
  setTimeout(function () {
      $(".fancybox").trigger('click');
  }, 2000);
});

请记住,此示例只能运行一次,除非您删除 cookie 或更改 cookie 名称。

【讨论】:

  • 谢谢@Rob。我没有运气就试了一下。我认为这是由于我的原始代码包括超时:setTimeout(function(){$(".fancybox").eq(0).trigger('click');},2000) ...无论如何,我已经更新了原始帖子以包含您建议的代码。
  • @NWTech,这次我用一个例子更新了我上面的答案。一切似乎都在工作。
猜你喜欢
  • 2021-07-16
  • 1970-01-01
  • 2018-04-26
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
相关资源
最近更新 更多