You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.8 KiB
80 lines
2.8 KiB
1 month ago
|
// 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
|
||
|
}));
|