I've developed a couple of alert boxes that display on all site pages.

The user is able to close each box separately:
$(document).ready(function() { $("#close-alert-box-news").click(function() { $("#alert-box-news").hide(800); }); $("#close-alert-box-maintenance").click(function() { $("#alert-box-maintenance").hide(800); }); }); .alert-box { width: 50vw; position: relative; margin: 20px auto; border: 1px solid black; } .alert-box-close { position: absolute; top: -12px; right: -12px; cursor: pointer; } <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"> </script> <article class="alert-box" id="alert-box-news"> <h1>News Alerts</h1> <p>text text text text text text text text text text text text text text</p> <a class="alert-box-close" id="close-alert-box-news"> <img src="http://i.imgur.com/czf8yas.png" height="25" width="25" alt=""> </a> </article> <article class="alert-box" id="alert-box-maintenance"> <h1>Site Maintenance</h1> <p>text text text text text text text text text text text text text text</p> <a class="alert-box-close" id="close-alert-box-maintenance"> <img src="http://i.imgur.com/czf8yas.png" height="25" width="25" alt=""> </a> </article> Now I need to make sure that the box the user closes (could be one, could be both), doesn't re-appear as he/she browses the site, or reloads a page.
I'm thinking I could set a PHP cookie to expire in 24 hours. But most of the related posts on this site recommend a JavaScript cookie. Unfortunately, my efforts to implement a JavaScript solution haven't worked (the boxes re-appear after being closed). I've tried various methods, as outlined here:
What would be a simple method to hide each box, sitewide, for 24 hours?
I'm open to jQuery, plain JavaScript, PHP, cookies, sessions or something else.
CSS Display Property. Each element has a default display value like inline-block , block , table ..etc. To hide an element with the display property, we should use display: none . When an element is hidden with display: none , all of its descendants will be removed along with it.
To hide an element, set the style display property to “none”. document. getElementById("element"). style.
Look, instead of using visibility: hidden; use display: none; . The first option will hide but still takes space and the second option will hide and doesn't take any space.
Following on @Loading.. answer:
the alert boxes always re-appear briefly on reload before disappearing. Any ideas?
Why is this?
The functions inside $(document).ready() will execute until the entire DOM is loaded. That's why the alerts are rendered, then as soon as the function runs, it hides them.
Solution:
You can initially hide your alerts with a class just to take advantage that the browser won't render the content until the CSSOM has been built.
The class we are using is just setting the property display: none;.
.hidden { display: none; } This will of course cause redraw in the browser. (see notes)
Your logic is already showing the alert with
if (localStorage.getItem('desiredTime') >= currentTime) { $('#alert-box-news').hide(); } else { $('#alert-box-news').show(); } Because using .show() will add an inline-style display: block; it will have a higher specificity than the .hidden class, showing the alert.
jsFiddle
Notes:
display: none; will push the content below the alert up or down. You can use other methods if you like, like visibility: hidden; or transform which is not in the scope of this answer. An illustration will be presented below doing the following steps:
localStorage function, setting the desiredTime key.Finally, just to check that the key is indeed being set, we go to:
DevTools (F12) -> Application Tab -> Local Storage -> jsFiddle shell.
Run is hit one more time, after the countdown has finished, showing the alert again.
Illustration:

We might need further details to solve the issue with this approach if it is not working live.
Use localStorage().
Local storage is per origin (per domain and protocol)
localStorage as localStorage.setItem('desiredTime', time) localStorage.getItem('desiredTime'), based on that show/hide jQuery
$(document).ready(function(){ //Get current time var currentTime = new Date().getTime(); //Add hours function Date.prototype.addHours = function(h) { this.setTime(this.getTime() + (h*60*60*1000)); return this; } //Get time after 24 hours var after24 = new Date().addHours(10).getTime(); //Hide div click $('.hide24').click(function(){ //Hide div $(this).hide(); //Set desired time till you want to hide that div localStorage.setItem('desiredTime', after24); }); //If desired time >= currentTime, based on that HIDE / SHOW if(localStorage.getItem('desiredTime') >= currentTime) { $('.hide24').hide(); } else { $('.hide24').show(); } }); HTML
<div>DIV-1</div> <div class='hide24'>DIV-2</div> Things to note
$.cookie as well, but that's an older approach now.<div> with class hide24 will be hidden only.localStorage, you should have HTML5 browsers.Web Storage HTML5
Hope this helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With