JSFiddle - React, Tailwind, and code Playground
HTML
Demo for <a href="http://stackoverflow.com/a/18608622/938089">http://stackoverflow.com/a/18608622/938089</a> by Rob W <gwnRob@gmail.com>
<br><br>
Expected events:<br>
Alert 1<br>
Alert 2
JavaScript
// http://stackoverflow.com/a/18608622/938089
document.addEventListener('beforeload', function(event) {
var target = event.target;
if (target.nodeName.toUpperCase() !== 'SCRIPT') return;
var dispatchEvent = function(name, bubbles, cancelable) {
var evt = new CustomEvent(name, {
bubbles: bubbles,
cancelable: cancelable
});
target.dispatchEvent(evt);
if (!evt.defaultPrevented) {
//window.dispatchEvent(evt);
}
if (evt.defaultPrevented) {
event.preventDefault();
}
};
var onload = function() {
cleanup();
dispatchEvent('afterscriptexecute', true, false);
};
var cleanup = function() {
target.removeEventListener('load', onload, true);
target.removeEventListener('error', cleanup, true);
}
target.addEventListener('error', cleanup, true);
target.addEventListener('load', onload, true);
dispatchEvent('beforescriptexecute', true, true);
}, true);
window.addEventListener('afterscriptexecute', function() {
alert(window.x);
});
document.head.appendChild(document.createElement('script')).src = 'data:text/javascript,x=1';
document.head.appendChild(document.createElement('script')).src = 'data:text/javascript,x=2';