Spaces:
Sleeping
Sleeping
// addapted from the document.currentScript polyfill by Adam Miller | |
// MIT license | |
// source: https://github.com/amiller-gh/currentScript-polyfill | |
// added support for Firefox https://bugzilla.mozilla.org/show_bug.cgi?id=1620505 | |
(function (root, factory) { | |
if (typeof define === 'function' && define.amd) { | |
define([], factory); | |
} else if (typeof module === 'object' && module.exports) { | |
module.exports = factory(); | |
} else { | |
root.getCurrentScript = factory(); | |
} | |
}(typeof self !== 'undefined' ? self : this, function () { | |
function getCurrentScript () { | |
var descriptor = Object.getOwnPropertyDescriptor(document, 'currentScript') | |
// for chrome | |
if (!descriptor && 'currentScript' in document && document.currentScript) { | |
return document.currentScript | |
} | |
// for other browsers with native support for currentScript | |
if (descriptor && descriptor.get !== getCurrentScript && document.currentScript) { | |
return document.currentScript | |
} | |
// IE 8-10 support script readyState | |
// IE 11+ & Firefox support stack trace | |
try { | |
throw new Error(); | |
} | |
catch (err) { | |
// Find the second match for the "at" string to get file src url from stack. | |
var ieStackRegExp = /.*at [^(]*\((.*):(.+):(.+)\)$/ig, | |
ffStackRegExp = /@([^@]*):(\d+):(\d+)\s*$/ig, | |
stackDetails = ieStackRegExp.exec(err.stack) || ffStackRegExp.exec(err.stack), | |
scriptLocation = (stackDetails && stackDetails[1]) || false, | |
line = (stackDetails && stackDetails[2]) || false, | |
currentLocation = document.location.href.replace(document.location.hash, ''), | |
pageSource, | |
inlineScriptSourceRegExp, | |
inlineScriptSource, | |
scripts = document.getElementsByTagName('script'); // Live NodeList collection | |
if (scriptLocation === currentLocation) { | |
pageSource = document.documentElement.outerHTML; | |
inlineScriptSourceRegExp = new RegExp('(?:[^\\n]+?\\n){0,' + (line - 2) + '}[^<]*<script>([\\d\\D]*?)<\\/script>[\\d\\D]*', 'i'); | |
inlineScriptSource = pageSource.replace(inlineScriptSourceRegExp, '$1').trim(); | |
} | |
for (var i = 0; i < scripts.length; i++) { | |
// If ready state is interactive, return the script tag | |
if (scripts[i].readyState === 'interactive') { | |
return scripts[i]; | |
} | |
// If src matches, return the script tag | |
if (scripts[i].src === scriptLocation) { | |
return scripts[i]; | |
} | |
// If inline source matches, return the script tag | |
if ( | |
scriptLocation === currentLocation && | |
scripts[i].innerHTML && | |
scripts[i].innerHTML.trim() === inlineScriptSource | |
) { | |
return scripts[i]; | |
} | |
} | |
// If no match, return null | |
return null; | |
} | |
}; | |
return getCurrentScript | |
})); | |