mmenu-js
Version:
The best javascript plugin for app look-alike on- and off-canvas menus with sliding submenus for your website and webapp.
74 lines (63 loc) • 2.16 kB
text/typescript
import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
import options from './_options';
import { extendShorthandOptions } from './_options';
import * as DOM from '../../_modules/dom';
import { extend } from '../../_modules/helpers';
// Add the options.
Mmenu.options.backButton = options;
export default function(this: Mmenu) {
if (!this.opts.offCanvas) {
return;
}
var options = extendShorthandOptions(this.opts.backButton);
this.opts.backButton = extend(options, Mmenu.options.backButton);
var _menu = '#' + this.node.menu.id;
// Close menu
if (options.close) {
var states = [];
const setStates = () => {
states = [_menu];
DOM.children(
this.node.pnls,
'.mm-panel_opened, .mm-panel_opened-parent'
).forEach(panel => {
states.push('#' + panel.id);
});
};
this.bind('open:finish', () => {
history.pushState(null, document.title, _menu);
});
this.bind('open:finish', setStates);
this.bind('openPanel:finish', setStates);
this.bind('close:finish', () => {
states = [];
history.back();
history.pushState(
null,
document.title,
location.pathname + location.search
);
});
window.addEventListener('popstate', evnt => {
if (this.vars.opened) {
if (states.length) {
states = states.slice(0, -1);
var hash = states[states.length - 1];
if (hash == _menu) {
this.close();
} else {
this.openPanel(this.node.menu.querySelector(hash));
history.pushState(null, document.title, _menu);
}
}
}
});
}
if (options.open) {
window.addEventListener('popstate', evnt => {
if (!this.vars.opened && location.hash == _menu) {
this.open();
}
});
}
}