gpt4 book ai didi

javascript - 访问模块脚本中定义的 html5 data-* 属性

转载 作者:行者123 更新时间:2023-12-05 04:52:15 25 4
gpt4 key购买 nike

在不使用模块的情况下加载脚本时,我可以使用 document.currentscript 访问自定义属性。

例如

<script src="js/myscript.js" data-custom-attribute="my-value"></script>

然后我可以在 myscript.js 中执行以下操作

// will contain "my-value"
const myAttribute = document.currentScript.getAttribute('data-custom-attribute');

但是,如果我使用模块语法加载 javascript,currentScript 将设置为 null,这不起作用。

<script src="js/myscript.js" data-custom-attribute="my-value" type="module"></script>

有没有办法仍然在 javascript 文件中访问这些属性?

最佳答案

来自 MDN

The Document.currentScript property returns the element whosescript is currently being processed and isn't a JavaScript module.(For modules use import.meta instead.)

import.meta 不提供数据属性。以下是一些备选方案:

[2022 年 5 月编辑] 从原始片段导入的内容不再存在。虽然它仍然是从 cdn.jsdelivr.net 加载的,但将来可能不是这样。因此,使用更多 persistent library 添加了一个新片段.

<script data-custom-attribute="my-value" type="module">
import {Logger} from
"https://cdn.jsdelivr.net/gh/KooiInc/DOM-Utilities@v1.1.2/SmallHelpers.js";
const log = Logger();
log(`document.currentScript is ${document.currentScript}`);
log(`But with querySelector ... data-custom-attribute from module script: ${
document.querySelector("script[type=module]").dataset.customAttribute}`);
log(`Or more precize: document.querySelector("script[data-custom-attribute]"): ${
document.querySelector("script[data-custom-attribute]")
.dataset.customAttribute}`);
log(`Or retrieve and filter document.scripts: ${[...document.scripts]
.find(scrpt => scrpt.dataset.customAttribute).dataset.customAttribute}`);
</script>

<script type="module" data-custom-attribute="my-value">
import $ from "https://kooiinc.github.io/JQL/lib/JQLBundle.js";
$.setStyle(`#result`, {whiteSpace: `nowrap`});
$.setStyle(`#result div`, {marginTop: `0.3rem`});
$.setStyle(`code`, {color: `green`});
const log = (...lines) =>
lines.forEach( line => $(`#result`).html(`<div>${line}</div>`, true));
const indent = `<br>&nbsp;&nbsp;`;

// --------------------------------------------------------------------------
log(`<code>document.currentScript</code> = ${document.currentScript}`);
log(`But<br>
<code>document.querySelector("script[type=module]")
.dataset.customAttribute</code> = "${
document.querySelector("script[type=module]").dataset.customAttribute}"`);
log(`Or targeted exactly<br>
<code>document.querySelector("script[data-custom-attribute]")
${indent}.dataset.customAttribute</code> = "${
document.querySelector("script[data-custom-attribute]")
.dataset.customAttribute}"`);
log(`Or retrieve from <code>document.scripts</code><br>
<code>[...document.scripts].find(scrpt =>
${indent}scrpt.dataset.customAttribute).dataset.customAttribute</code> = "${
[...document.scripts].find(scrpt => scrpt.dataset.customAttribute)
.dataset.customAttribute}"`);
</script>

<div id="result"></result>

关于javascript - 访问模块脚本中定义的 html5 data-* 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66582215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com