所以我有三个条目,都以相同的方式填充。顶级作品。底部工作。而中间没有。如果只有 1 个工作或没有工作,我可能会有一些想法,但只有中间失败,我挠头。 Edge 和 Firefox 中的行为相同。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Lesson Prompts</title>
</head>
<body>
<h1>Lesson Prompts</h1>
<div id="prompts"></div>
<script id="lessondata" type="application/json">
{
"prompts": [
{
"audio": "prompt1.mp3",
"spanish": "Hola, ¿cómo estás?",
"english": "Hello, how are you?"
},
{
"audio": "prompt3.mp3",
"spanish": "¿Qué hora es?",
"english": "What time is it?"
},
{
"audio": "prompt2.mp3",
"spanish": "Me llamo Juan.",
"english": "My name is Juan."
}
]
}
</script>
<script>
var data = JSON.parse(document.getElementById('lessondata').textContent);
const promptsEl = document.getElementById('prompts');
data.prompts.forEach(prompt => {
const promptEl = document.createElement('div');
promptEl.classList.add('prompt');
promptEl.innerHTML = `
<button class="toggle-btn">Show/Hide</button>
<audio src="${prompt.audio}" controls></audio>
<p class="spanish">${prompt.spanish}</p>
<div class="english hidden">${prompt.english}</div>
`;
promptsEl.appendChild(promptEl);
const toggleBtns = document.querySelectorAll('.toggle-btn');
toggleBtns.forEach(btn => {
btn.addEventListener('click', () => {
const promptEl = btn.parentElement;
const englishEl = promptEl.querySelector('.english');
englishEl.classList.toggle('hidden');
});
});
});
</script>
<style>
.hidden {
display: none;
}
</style>
</body>
</html>
你应该把事件附加代码块放在第一个
forEach
循环的外面。
演示:
var data = JSON.parse(document.getElementById('lessondata').textContent);
const promptsEl = document.getElementById('prompts');
data.prompts.forEach(prompt => {
const promptEl = document.createElement('div');
promptEl.classList.add('prompt');
promptEl.innerHTML = `
<button class="toggle-btn">Show/Hide</button>
<audio src="${prompt.audio}" controls></audio>
<p class="spanish">${prompt.spanish}</p>
<div class="english hidden">${prompt.english}</div>
`;
promptsEl.appendChild(promptEl);
//remove from here
});
//place here
const toggleBtns = document.querySelectorAll('.toggle-btn');
toggleBtns.forEach(btn => {
btn.addEventListener('click', (e) => {
const promptEl = btn.parentElement;
const englishEl = promptEl.querySelector('.english');
englishEl.classList.toggle('hidden');
});
});
.hidden {
display: none;
}
<h1>Lesson Prompts</h1>
<div id="prompts"></div>
<script id="lessondata" type="application/json">
{
"prompts": [
{
"audio": "prompt1.mp3",
"spanish": "Hola, ¿cómo estás?",
"english": "Hello, how are you?"
},
{
"audio": "prompt3.mp3",
"spanish": "¿Qué hora es?",
"english": "What time is it?"
},
{
"audio": "prompt2.mp3",
"spanish": "Me llamo Juan.",
"english": "My name is Juan."
}
]
}
</script>
将
addEventListener
移出第一个forEach
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Lesson Prompts</title>
</head>
<body>
<h1>Lesson Prompts</h1>
<div id="prompts"></div>
<script id="lessondata" type="application/json">
{
"prompts": [
{
"audio": "prompt1.mp3",
"spanish": "Hola, ¿cómo estás?",
"english": "Hello, how are you?"
},
{
"audio": "prompt3.mp3",
"spanish": "¿Qué hora es?",
"english": "What time is it?"
},
{
"audio": "prompt2.mp3",
"spanish": "Me llamo Juan.",
"english": "My name is Juan."
}
]
}
</script>
<script>
var data = JSON.parse(document.getElementById('lessondata').textContent);
const promptsEl = document.getElementById('prompts');
data.prompts.forEach((prompt) => {
const promptEl = document.createElement('div');
promptEl.classList.add('prompt');
promptEl.innerHTML = `
<button class="toggle-btn">Show/Hide</button>
<audio src="${prompt.audio}" controls></audio>
<p class="spanish">${prompt.spanish}</p>
<div class="english hidden">${prompt.english}</div>
`;
promptsEl.appendChild(promptEl);
});
const toggleBtns = document.querySelectorAll('.toggle-btn');
console.log(toggleBtns.length);
toggleBtns.forEach((btn) => {
btn.addEventListener('click', function () {
const promptEl = btn.parentElement;
const englishEl = promptEl.querySelector('.english');
console.log(englishEl);
englishEl.classList.toggle('hidden');
});
});
</script>
<style>
.hidden {
display: none;
}
</style>
</body>
</html>
var data = JSON.parse(document.getElementById('lessondata').textContent);
const promptsEl = document.getElementById('prompts');
data.prompts.forEach(prompt => {
const promptEl = document.createElement('div');
promptEl.classList.add('prompt');
promptEl.innerHTML = `
<button class="toggle-btn">Show/Hide</button>
<audio src="${prompt.audio}" controls></audio>
<p class="spanish">${prompt.spanish}</p>
<div class="english hidden">${prompt.english}</div>
`;
promptsEl.appendChild(promptEl);
//remove from here
});
//place here
const toggleBtns = document.querySelectorAll('.toggle-btn');
toggleBtns.forEach(btn => {
btn.addEventListener('click', (e) => {
const promptEl = btn.parentElement;
const englishEl = promptEl.querySelector('.english');
englishEl.classList.toggle('hidden');
});
});
.hidden {
display: none;
}
<h1>Lesson Prompts</h1>
<div id="prompts"></div>
<script id="lessondata" type="application/json">
{
"prompts": [
{
"audio": "prompt1.mp3",
"spanish": "Hola, ¿cómo estás?",
"english": "Hello, how are you?"
},
{
"audio": "prompt3.mp3",
"spanish": "¿Qué hora es?",
"english": "What time is it?"
},
{
"audio": "prompt2.mp3",
"spanish": "Me llamo Juan.",
"english": "My name is Juan."
}
]
}
</script>