app/javascript/blacklight/core.js
const Blacklight = function() {
const buffer = new Array;
return {
onLoad: function(func) {
buffer.push(func);
},
activate: function() {
for(let i = 0; i < buffer.length; i++) {
buffer[i].call();
}
},
listeners: function () {
const listeners = [];
if (typeof Turbo !== 'undefined') {
listeners.push('turbo:load', 'turbo:frame-load');
} else if (typeof Turbolinks !== 'undefined' && Turbolinks.supported) {
// Turbolinks 5
if (Turbolinks.BrowserAdapter) {
listeners.push('turbolinks:load');
} else {
// Turbolinks < 5
listeners.push('page:load', 'DOMContentLoaded');
}
} else {
listeners.push('DOMContentLoaded');
}
return listeners;
}
};
}();
// turbolinks triggers page:load events on page transition
// If app isn't using turbolinks, this event will never be triggered, no prob.
Blacklight.listeners().forEach(function(listener) {
document.addEventListener(listener, function() {
Blacklight.activate()
})
})
Blacklight.onLoad(function () {
const elem = document.querySelector('.no-js');
// The "no-js" class may already have been removed because this function is
// run on every turbo:load event, in that case, it won't find an element.
if (!elem) return;
elem.classList.remove('no-js')
elem.classList.add('js')
})
export default Blacklight