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.
79 lines
2.8 KiB
79 lines
2.8 KiB
// 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 |
|
}));
|
|
|