Skip to content

Instantly share code, notes, and snippets.

@JamesMGreene
Last active August 29, 2015 14:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JamesMGreene/d38bd9771ee87c10bee7 to your computer and use it in GitHub Desktop.
Save JamesMGreene/d38bd9771ee87c10bee7 to your computer and use it in GitHub Desktop.
Basic `script.readyState`/`document.readyState` tests
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Basic `script.readyState`/`document.readyState` tests</title>
<script id="loadFirst">
window.console && console && console.log && console.log("loadFirst script, evaluating first line");
function _write(msg) {
var bod = document.body || document.getElementsByTagName("body")[0];
if (bod && (!("readyState" in document) || document.readyState === "complete")) {
bod.innerHTML += msg;
}
else {
document.write(msg);
}
}
function _log(msg) {
if (typeof console !== "undefined" && console && console.log) {
console.log(msg);
}
}
function getScriptIds(scriptEls) {
var scriptIds = [];
if (scriptEls) {
for (var i = 0, len = scriptEls.length; i < len; i++) {
scriptIds.push(scriptEls[i].id);
}
}
return scriptIds;
}
function getReadyStates(scriptEls) {
var scriptStates = [];
if (scriptEls) {
for (var i = 0, len = scriptEls.length; i < len; i++) {
scriptStates.push(scriptEls[i].readyState);
}
}
return scriptStates;
}
function toArray(nodeList) {
try {
return [].slice.call(nodeList);
}
catch (e) {
var arr = [];
if (nodeList) {
for (var i = 0, len = nodeList.length; i < len; i++) {
arr.push(nodeList[i]);
}
}
return arr;
}
}
function showState(name) {
var scripts = toArray(document.getElementsByTagName("script"));
var scriptCount = scripts.length;
var output = [];
output.push("<div><strong>[" + name + "] document.readyState:</strong> " + document.readyState + "</div>");
output.push("<div><strong>[" + name + "] scripts (" + scriptCount + ") IDs:</strong> " + getScriptIds(scripts).join(", ") + "</div>");
if (hasRSSupport) {
output.push("<div><strong>[" + name + "] scripts (" + scriptCount + ") readyStates:</strong> " + getReadyStates(scripts).join(", ") + "</div>");
}
for (var i = 0, len = output.length; i < len; i++) {
_write(output[i]);
}
}
function appendScriptReadyState(scriptNode) {
return (hasRSSupport ? ", readyState:</strong> " + scriptNode.readyState : "</strong>") + "</div>"
}
function addScriptEventHandlers(scriptNode) {
if (!scriptNode) {
return;
}
var scriptName = scriptNode.id || scriptNode.name || "ADD_A_SCRIPT_ID_PLEASE";
if ("onactivate" in scriptNode) {
if (scriptNode.addEventListener) {
scriptNode.addEventListener("activate", function() { _write("<div><strong>[added] " + scriptName + " activated" + appendScriptReadyState(scriptNode) + "</div>"); }, false);
scriptNode.addEventListener("deactivate", function() { _write("<div><strong>[added] " + scriptName + " deactivated" + appendScriptReadyState(scriptNode) + "</div>"); }, false);
}
else if (scriptNode.attachEvent) {
scriptNode.attachEvent("onactivate", function() { _write("<div><strong>[attached] " + scriptName + " activated" + appendScriptReadyState(scriptNode) + "</div>"); });
scriptNode.attachEvent("ondeactivate", function() { _write("<div><strong>[attached] " + scriptName + " deactivated" + appendScriptReadyState(scriptNode) + "</div>"); });
}
else {
scriptNode.onactivate = function() { _write("<div><strong>[on] " + scriptName + " activated" + appendScriptReadyState(scriptNode) + "</div>"); };
scriptNode.ondeactivate = function() { _write("<div><strong>[on] " + scriptName + " deactivated" + appendScriptReadyState(scriptNode) + "</div>"); };
}
}
else if (scriptNode.addEventListener) {
scriptNode.addEventListener("DOMActivate", function() { _write("<div><strong>[added] " + scriptName + " DOMActivated" + appendScriptReadyState(scriptNode) + "</div>"); }, false);
scriptNode.addEventListener("DOMDeactivate", function() { _write("<div><strong>[added] " + scriptName + " DOMDeactivated" + appendScriptReadyState(scriptNode) + "</div>"); }, false);
}
if (scriptNode.addEventListener) {
scriptNode.addEventListener("readystatechange", function() { _write("<div><strong>[added] " + scriptName + " readystatechanged" + appendScriptReadyState(scriptNode) + "</div>"); }, false);
scriptNode.addEventListener("load", function() { _log(scriptName + " script, load complete"); _write("<div><strong>[added] " + scriptName + " loaded" + appendScriptReadyState(scriptNode) + "</div>"); }, false);
scriptNode.addEventListener("error", function() { _write("<div><strong>[added] " + scriptName + " erred" + appendScriptReadyState(scriptNode) + "</div>"); }, false);
}
else if (scriptNode.attachEvent) {
scriptNode.attachEvent("onreadystatechange", function() { _write("<div><strong>[attached] " + scriptName + " readystatechanged" + appendScriptReadyState(scriptNode) + "</div>"); });
scriptNode.attachEvent("onload", function() { _log(scriptName + " script, load complete"); _write("<div><strong>[attached] " + scriptName + " loaded" + appendScriptReadyState(scriptNode) + "</div>"); });
scriptNode.attachEvent("onerror", function() { _write("<div><strong>[attached] " + scriptName + " erred" + appendScriptReadyState(scriptNode) + "</div>"); });
}
else {
scriptNode.onreadystatechange = function() { _write("<div><strong>[on] " + scriptName + " readystatechanged" + appendScriptReadyState(scriptNode) + "</div>"); };
scriptNode.onload = function() { _log(scriptName + " script, load complete"); _write("<div><strong>[on] " + scriptName + " loaded" + appendScriptReadyState(scriptNode) + "</div>"); };
scriptNode.onerror = function() { _write("<div><strong>[on] " + scriptName + " erred" + appendScriptReadyState(scriptNode) + "</div>"); };
}
return scriptNode;
}
var addedIdList = [];
function mutationObservation(mutationRecordsList, mutationObserver) {
mutationRecordsList.forEach(function(mutationRecord) {
if (mutationRecord.type === "childList") {
if (mutationRecord.addedNodes) {
for (var i = 0, len = mutationRecord.addedNodes.length; i < len; i++) {
if (mutationRecord.addedNodes[i].nodeName === "SCRIPT" && addedIdList.indexOf(mutationRecord.addedNodes[i].id) === -1) {
_log("Added script! ID: " + mutationRecord.addedNodes[i].id);
addScriptEventHandlers(mutationRecord.addedNodes[i]);
addedIdList.push(mutationRecord.addedNodes[i].id);
}
}
}
else if (mutationRecord.removedNodes) {
for (var i = 0, len = mutationRecord.removedNodes.length; i < len; i++) {
if (mutationRecord.removedNodes[i].nodeName === "SCRIPT") {
_log("Removed script! ID: " + mutationRecord.removedNodes[i].id);
}
}
}
}
});
}
var observer = new MutationObserver(mutationObservation);
observer.observe(document, {
attributes: false,
characterData: false,
childList: true,
subtree: true
});
_write("<div><strong>UserAgent:</strong> " + navigator.userAgent + "</div>");
var scripts = document.getElementsByTagName("script");
var current = scripts[0];
var hasRSSupport = "readyState" in current;
_write("<div><strong>script.readyState supported?</strong> " + hasRSSupport + "</div>");
var hasCSSupport = "currentScript" in document;
_write("<div><strong>Native currentScript supported?</strong> " + hasCSSupport + "</div>");
showState('loadFirst');
_log("loadFirst script, evaluating last line");
</script>
<script id="inlineScript">
_log("inlineScript script, evaluating first line");
showState('inlineScript');
var head = document.head || document.getElementsByTagName("head")[0];
var newFirstScript = document.createElement("script");
newFirstScript.id = "dynamicFirstScript";
newFirstScript.text = '_log("dynamicFirstScript, evaluating first line"); showState("dynamicFirstScript"); _log("dynamicFirstScript, evaluating last line");';
newFirstScript.async = false;
//addScriptEventHandlers(newFirstScript);
head.insertBefore(newFirstScript, head.firstChild);
_log("inlineScript script, evaluating last line");
</script>
<script id="loadLast">
_log("loadLast script, evaluating first line");
showState('loadLast');
var newLastScript = document.createElement("script");
newLastScript.id = "dynamicLastScript";
newLastScript.text = '_log("dynamicLastScript, evaluating first line"); showState("dynamicLastScript"); _log("dynamicLastScript, evaluating last line");';
newLastScript.async = false;
//addScriptEventHandlers(newLastScript);
head = document.head || document.getElementsByTagName("head")[0];
head.appendChild(newLastScript);
window.onload = function() {
showState("pageLoaded");
setTimeout(function() {
var lateScript = document.createElement("script");
lateScript.id = "lateScript";
lateScript.text = '_log("lateScript, evaluating first line"); showState("lateScript"); _log("lateScript, evaluating last line");';
lateScript.async = false;
//addScriptEventHandlers(lateScript);
var body = document.body || document.getElementsByTagName("body")[0];
body.appendChild(lateScript);
}, 500);
};
_log("loadLast script, evaluating last line");
</script>
</head>
<body>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment