用另一个文本覆盖一个 HTML 元素的 ID
Overwriting the ID of one HTML element with the text of another
我使用 CMS Webflow(网站构建器的 CMS 功能)来构建 HTML 重复的元素。 Webflow 会自动复制这些。不幸的是,它还复制了元素本身和所有嵌套元素的 ID,使它们成为 non-unique。由于种种原因,我不得不使用这个功能。
现在我使用嵌入式脚本将特定嵌套 HTML 元素(标题)的 ID 覆盖为另一个(也是标题)的 innerText。这两个元素都位于提到的自动复制的元素内。
第二个标题文本(我要抓取其文本的参考标题)由 CMS 功能自动填充,因此是唯一的。
但是当我将第一个标题的新 Id 记录到控制台时(它被第二个标题的 innerText 覆盖),它只是空的。在下面的代码中,我添加了带有替代代码行的注释(// 或者:),这使得代码可以工作,但不是我们想要的。
<script>
$(document).ready(function(event) {
let elementToBeChanged = $(event.target).next("#changeMyId");
let elementWithReferenceText = $(event.target).parent().next("#useMeToChangeId");
// alternatively: let elementWithReferenceText = $(this).find("#useMeToChangeId");
let newId = elementWithReferenceText.text();
// alternatively: let newId = Math.floor(Math.random()*6) // to verify that generating a unique ID each time the element gets duplicated is possible (it is)
console.log(newId) // to compare with console.log(elementToBeChanged.id) if ID was changed correctly
elementToBeChanged.id = newId;
console.log(elementToBeChanged.id); // to check if ID was changed
});
</script>
我认为代码的问题在于 select 没有正确的第二个标题。
奇怪的是 jQuery select 或者它有效:
let elementWithReferenceText = $(this).find("#useMeToChangeId");
但显然每次都会用相同的值覆盖 ID,因为它不是相对路径。
不幸的是,相对路径不起作用,console.log(newId) 日志在控制台上是空的(我认为是这一行的问题):
let elementWithReferenceText = $(event.target).parent().next("#useMeToChangeId");
我使用以下内容来验证每次复制元素时生成唯一 ID 是可能的(它是)
let newId = Math.floor(Math.random()*6)
我做错了什么?
let elementWithReferenceText = $(this).find("#useMeToChangeId");
这只是在 $(this)
中找到 ID 为 useMeToChangeId 的元素,它在 $(document).ready()
中是(我假设)文档。这使得它几乎等同于仅调用 $('#useMeToChangeId');
。当然,如果页面上存在具有该 ID 的元素,这将起作用。
你可以检查let elementWithReferenceText = $(event.target).parent().next("#useMeToChangeId");
是否真的做了一些事情。也许 $(event.target)
的父元素后面没有 ID 为 "useMeToChangeId" 的元素。您检查过 elementWithReferenceText
是否包含一个值吗?例如
console.log(elementWithReferenceText);
定义 elementWithReferenceText
之后?
我建议您查询所有具有 ID 的元素并根据需要进行更改。您的脚本标签必须在所有已重复的元素之后
Array.from(document.querySelectorAll("#duplicate"))
.forEach((el, index) => {
if (index > 0) {
el.id = el.id + "-" + index;
}
});
Array.from(document.querySelectorAll("p"))
.forEach((el, i) => {
console.log(`Element index ${i}, id: ${el.id}`)
});
<p id="duplicate">
</p>
<p id="duplicate">
</p>
<p id="duplicate">
</p>
您可以在自定义 HTML 嵌入块中使用 Webflow CMS 数据设置元素的 ID。
在集合项中,添加一个嵌入,然后“+ 添加字段”按钮将允许您在代码中使用您的 CMS 数据。
Webflow 嵌入图像:
我使用 CMS Webflow(网站构建器的 CMS 功能)来构建 HTML 重复的元素。 Webflow 会自动复制这些。不幸的是,它还复制了元素本身和所有嵌套元素的 ID,使它们成为 non-unique。由于种种原因,我不得不使用这个功能。
现在我使用嵌入式脚本将特定嵌套 HTML 元素(标题)的 ID 覆盖为另一个(也是标题)的 innerText。这两个元素都位于提到的自动复制的元素内。
第二个标题文本(我要抓取其文本的参考标题)由 CMS 功能自动填充,因此是唯一的。
但是当我将第一个标题的新 Id 记录到控制台时(它被第二个标题的 innerText 覆盖),它只是空的。在下面的代码中,我添加了带有替代代码行的注释(// 或者:),这使得代码可以工作,但不是我们想要的。
<script>
$(document).ready(function(event) {
let elementToBeChanged = $(event.target).next("#changeMyId");
let elementWithReferenceText = $(event.target).parent().next("#useMeToChangeId");
// alternatively: let elementWithReferenceText = $(this).find("#useMeToChangeId");
let newId = elementWithReferenceText.text();
// alternatively: let newId = Math.floor(Math.random()*6) // to verify that generating a unique ID each time the element gets duplicated is possible (it is)
console.log(newId) // to compare with console.log(elementToBeChanged.id) if ID was changed correctly
elementToBeChanged.id = newId;
console.log(elementToBeChanged.id); // to check if ID was changed
});
</script>
我认为代码的问题在于 select 没有正确的第二个标题。 奇怪的是 jQuery select 或者它有效:
let elementWithReferenceText = $(this).find("#useMeToChangeId");
但显然每次都会用相同的值覆盖 ID,因为它不是相对路径。
不幸的是,相对路径不起作用,console.log(newId) 日志在控制台上是空的(我认为是这一行的问题):
let elementWithReferenceText = $(event.target).parent().next("#useMeToChangeId");
我使用以下内容来验证每次复制元素时生成唯一 ID 是可能的(它是)
let newId = Math.floor(Math.random()*6)
我做错了什么?
let elementWithReferenceText = $(this).find("#useMeToChangeId");
这只是在 $(this)
中找到 ID 为 useMeToChangeId 的元素,它在 $(document).ready()
中是(我假设)文档。这使得它几乎等同于仅调用 $('#useMeToChangeId');
。当然,如果页面上存在具有该 ID 的元素,这将起作用。
你可以检查let elementWithReferenceText = $(event.target).parent().next("#useMeToChangeId");
是否真的做了一些事情。也许 $(event.target)
的父元素后面没有 ID 为 "useMeToChangeId" 的元素。您检查过 elementWithReferenceText
是否包含一个值吗?例如
console.log(elementWithReferenceText);
定义 elementWithReferenceText
之后?
我建议您查询所有具有 ID 的元素并根据需要进行更改。您的脚本标签必须在所有已重复的元素之后
Array.from(document.querySelectorAll("#duplicate"))
.forEach((el, index) => {
if (index > 0) {
el.id = el.id + "-" + index;
}
});
Array.from(document.querySelectorAll("p"))
.forEach((el, i) => {
console.log(`Element index ${i}, id: ${el.id}`)
});
<p id="duplicate">
</p>
<p id="duplicate">
</p>
<p id="duplicate">
</p>
您可以在自定义 HTML 嵌入块中使用 Webflow CMS 数据设置元素的 ID。
在集合项中,添加一个嵌入,然后“+ 添加字段”按钮将允许您在代码中使用您的 CMS 数据。
Webflow 嵌入图像: