javascript - 使用模板文字创建 HTML 时如何使用参数设置 onclick 侦听器?
问题描述
我正在做一个代码测验,并使用 map 函数遍历一组对象,每个对象都包含每个问题的标题、选项和答案。我使用模板文字使代码易于阅读。创建按钮时,map 函数中的键具有正确的值,但是,当我单击按钮时,它总是返回 0。
function printIt(input){
console.log(input);
}
var question = `
<div class='title'>
<h1>${questions[cur].title}</h1>
<p>${questions[cur].choices.map((item, i) => `
<button class='answers' id='${i}' onclick='${printIt(i)}'>${item}</button><br />
`).join('')}</p>
</div>
`;
//put on page
$("#container").append(question);
解决方案
虽然您可以通过确保onclick
属性字符串包含函数来修复它,例如
onclick='console.log(2)'
内联处理程序被广泛认为是非常糟糕的做法,因为它们有许多范围问题和字符串转义问题。最好使用 Javascript 添加侦听器。使用事件委托#container
- 当单击其中的按钮时,检查按钮的 ,并使用它id
调用:printIt
id
var question = `
<div class='title'>
<h1>${questions[cur].title}</h1>
<p>${questions[cur].choices.map((item, i) => `
<button class='answers' id=${i}>${item}</button><br />
`).join('')}</p>
</div>
`;
//put on page
$("#container").append(question);
$("#container").on('click', 'button.answers', function() {
printIt(this.id);
});
但是数字索引的 ID 也是一种代码味道,并且在单个文档中有重复的 ID 是无效的 HTML。除非需要i
它们,否则您可以通过在单击时检查其父容器中单击的按钮的索引来完全避免需要:
var question = `
<div class='title'>
<h1>${questions[cur].title}</h1>
<p>${questions[cur].choices.map((item) => `
<button class='answers'>${item}</button><br />
`).join('')}</p>
</div>
`;
//put on page
$("#container").append(question);
$("#container").on('click', 'button.answers', function() {
const index = [...this.parentElement.children].indexOf(this);
printIt(index);
});
推荐阅读
- java - 使用二维数组和嵌套循环打印几何序列表
- single-sign-on - ADFS 中信赖方信任的 App Embed 链接是什么
- ios - Flutter iOS 14.5 - 使用新的跟踪/隐私指南处理外部网站 cookie
- python - 跳过部分截图
- matlab - 在 MATLAB 中使用 sendmail 指定 cc 地址
- python - 在不启动 webdriver 的情况下设置 python selenium webdriver
- flutter - Vercel 上的 Flutter 项目部署
- node.js - 缓慢的 postgres 结果
- python - 当 RGBA 颜色在 RGB 颜色上渲染时产生的 RGB 颜色
- typescript - TypeScript Facade 组件只是动态替换为其他组件