Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | /* eslint-disable prefer-const */
// ref: https://github.com/sodatea/get-current-script/blob/main/index.js
/**
* 返回当前正在运行的脚本所属的 `<script>` 元素。有两点限制:
*
* - 只在脚本被解析后首次运行时有效;
* - 如果当前正在执行的代码是被其他代码作为回调函数或者事件处理函数调用的,会返回 `null`。
*/
export function getCurrentScript(): HTMLScriptElement | null {
const descriptor = Object.getOwnPropertyDescriptor(document, 'currentScript')
// for chrome
Iif (!descriptor && 'currentScript' in document && document.currentScript) {
return document.currentScript as any
}
// for other browsers with native support for currentScript
Iif (
descriptor &&
descriptor.get !== getCurrentScript &&
document.currentScript
) {
return document.currentScript as any
}
// 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.
let ieStackRegExp = /.*at [^(]*\((.*):(.+):(.+)\)$/gi,
ffStackRegExp = /@([^@]*):(\d+):(\d+)\s*$/gi,
stackDetails =
// @ts-ignore
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
// try to find the matching external script first
for (let i = 0; i < scripts.length; i++) {
// If ready state is interactive, return the script tag
if ((scripts[i] as any).readyState === 'interactive') {
return scripts[i]
}
// If src matches, return the script tag
if (scripts[i].src === scriptLocation) {
return scripts[i]
}
}
// if not found, the current script is likely inline
Iif (scriptLocation === currentLocation) {
pageSource = document.documentElement.outerHTML
inlineScriptSourceRegExp = new RegExp(
`(?:[^\\n]+?\\n){0,${
(line as any) - 2
}}[^<]*<script>([\\d\\D]*?)<\\/script>[\\d\\D]*`,
'i',
)
inlineScriptSource = pageSource
.replace(inlineScriptSourceRegExp, '$1')
.trim()
// find the matching inline script
for (let i = 0; i < scripts.length; i++) {
if (
scripts[i].innerHTML &&
scripts[i].innerHTML.trim() === inlineScriptSource
)
return scripts[i]
}
}
// If no match, return null
return null
}
}
|