在 Javascript 中替换 CMS 中的多个字符串
Replace multiple strings from CMS in Javascript
此代码当前从 CMS 获取 'dynamic words' 并将其更改为 span 的代码,当您单击它们时,它会在其上获得一个事件侦听器,会发生一些事情。但目前它只从 CMS 获取最后一个 'dynamic word',而不是所有的。
我正在考虑将其放入循环中,但我认为这行不通。
有人知道问题出在哪里吗?
代码沙箱:
https://codesandbox.io/s/musing-wozniak-zzwps2?file=/src/App.js
如果你能提供一个能执行你的问题的最小复制就更好了(我建议使用 CodeSandbox),但我想问题的关键部分是 const el = document.getElementById('textblock');
并且 id 不是唯一的,所以在你的代码完成 运行 之后,功能会在你的动态词的每个循环中起作用,但是它们会覆盖它们在 id 的唯一一个元素上的结果是 'textblock'
,所以你只能看到最后一个结果.
nit: 如果完全重写 ArticleBodyText
中的代码将得到维护和阅读,它现在处于非常可变的风格(查询 DOM 并直接改变 innerHTML
)
好的,我看到了你的 CodeSandbox 复制品,你应该在每个循环中查询 DOM 元素,而不是在循环 运行.
之上查询一次
useEffect(() => {
// remove these lines
// const el = document.querySelector(".textblock");
// const text = el.innerHTML;
dynamic_words.map((word) => {
// and replace lines above into the loop
const el = document.querySelector(".textblock");
const text = el.innerHTML;
// ...
})
})
对于事件侦听器,您应该将条件 this.innerHTML.includes(dynamic_word)
编辑为 this.innerHTML.includes(dynamic_words[i])
此代码当前从 CMS 获取 'dynamic words' 并将其更改为 span 的代码,当您单击它们时,它会在其上获得一个事件侦听器,会发生一些事情。但目前它只从 CMS 获取最后一个 'dynamic word',而不是所有的。 我正在考虑将其放入循环中,但我认为这行不通。
有人知道问题出在哪里吗?
代码沙箱:
https://codesandbox.io/s/musing-wozniak-zzwps2?file=/src/App.js
如果你能提供一个能执行你的问题的最小复制就更好了(我建议使用 CodeSandbox),但我想问题的关键部分是 const el = document.getElementById('textblock');
并且 id 不是唯一的,所以在你的代码完成 运行 之后,功能会在你的动态词的每个循环中起作用,但是它们会覆盖它们在 id 的唯一一个元素上的结果是 'textblock'
,所以你只能看到最后一个结果.
nit: 如果完全重写 ArticleBodyText
中的代码将得到维护和阅读,它现在处于非常可变的风格(查询 DOM 并直接改变 innerHTML
)
好的,我看到了你的 CodeSandbox 复制品,你应该在每个循环中查询 DOM 元素,而不是在循环 运行.
之上查询一次useEffect(() => {
// remove these lines
// const el = document.querySelector(".textblock");
// const text = el.innerHTML;
dynamic_words.map((word) => {
// and replace lines above into the loop
const el = document.querySelector(".textblock");
const text = el.innerHTML;
// ...
})
})
对于事件侦听器,您应该将条件 this.innerHTML.includes(dynamic_word)
编辑为 this.innerHTML.includes(dynamic_words[i])