49 lines
No EOL
1.8 KiB
JavaScript
49 lines
No EOL
1.8 KiB
JavaScript
/*eslint no-var: "error" */
|
|
/*eslint no-unused-vars: "off" */
|
|
/*eslint linebreak-style: "off" */
|
|
/*eslint no-trailing-spaces: "off" */
|
|
/*eslint-env es6*/
|
|
|
|
import Debugger from './debugger';
|
|
const debug = new Debugger("browserbuttonevents");
|
|
|
|
/**
|
|
*
|
|
* @param {function} backwardCB
|
|
* @param {function} forwardCB
|
|
* @param {function} reloadCB
|
|
*/
|
|
export function addBrowserButtonEvent(backwardCB, forwardCB = null, reloadCB = null) {
|
|
debug.log("Registering navigation events",backwardCB,forwardCB,reloadCB);
|
|
const reorient = (e) => { // After travelling in the history stack
|
|
const positionLastShown = Number( // If none, then zero
|
|
sessionStorage.getItem( 'positionLastShown' ));
|
|
// debug.log("Popstate event",e,positionLastShown,history);
|
|
let position = history.state; // Absolute position in stack
|
|
if( position === null ) { // Meaning a new entry on the stack
|
|
position = positionLastShown + 1; // Top of stack
|
|
|
|
// (1) Stamp the entry with its own position in the stack
|
|
history.replaceState( position, /*no title*/'' );
|
|
}
|
|
|
|
// (2) Keep track of the last position shown
|
|
sessionStorage.setItem( 'positionLastShown', String(position) );
|
|
|
|
// (3) Discover the direction of travel by comparing the two
|
|
const direction = Math.sign( position - positionLastShown );
|
|
debug.log( 'Travel direction is ' + direction );
|
|
// One of backward (-1), reload (0) and forward (1)
|
|
if (direction == -1 && backwardCB) {
|
|
backwardCB();
|
|
}
|
|
if (direction == 1 && forwardCB) {
|
|
forwardCB();
|
|
}
|
|
if (direction == 0 && reloadCB) {
|
|
reloadCB();
|
|
}
|
|
};
|
|
//addEventListener( 'pageshow', reorient );
|
|
addEventListener( 'popstate', reorient ); // Travel in same page
|
|
} |