I have been trying to get the forward an back browser buttons to work on a small site using pjax and have come up with the following code to handle class changes and fading in and out the various overlays.
However I have found that Chrome and Safari treats the initial page load as a popstate and so it is causing me grief. Is there anyway to stop this?
$(window).on("popstate", function() {
if ($('body').hasClass('info')) {
$('body').removeClass("info").addClass("work");
$('.info_overlay').fadeOut(duration);
alert('popstate');
} else if ($('body').hasClass('work')) {
$('body').removeClass("work").addClass("info");
$('.info_overlay').fadeIn(duration);
} else {
$('body').removeClass("project").addClass("work");
$('.project_overlay').fadeOut(duration);
}
});
Tag the state when you call pushState()
, then ignore all popstate
events that don't have your tag. e.g.
history.pushState({ myTag: true }, ...)
$(window).on("popstate", function(e) {
if (!e.originalEvent.state.myTag) return; // not my problem
// rest of your popstate handler goes here
}
Don't forget to call replaceState
at page load so that you can handle the popstate when you get back to the initial page load.
$(function() { history.replaceState({ myTag: true }); });
I actually found the solution within pjax itself.
Instead of doing:
$(window).on('popstate', function() { ...
which fired the popstate on the initial page load I did:
$(window).on('pjax:popstate', function() {...
The best long term fix is to up-vote https://code.google.com/p/chromium/issues/detail?id=63040 to get Google to fix this. They've known they're out of compliance with the HTML5 spec for about two years now.
In order to solve the initial page load as a popstate in safari and chrome browsers, we can use SetTimeOut function.
This simply works !!
setTimeout( function() {
window.addEventListener( 'popstate', myFunction, false );
}, 500 );
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