radio按钮change事件动态创建HTML元素无响应如何解决
问题排查与修复
你的代码触发不了效果是几个基础错误导致的,按顺序修改即可:
- 单选按钮缺失value属性
这是最核心的问题。你写的判断逻辑是拿选中单选框的value和standard/business做对比,但你的HTML里三个radio标签都没加value属性,jQuery的.val()方法拿不到对应的值,if判断永远不会成立,自然不会有任何DOM变化。
给三个input补上对应value即可,修改后的HTML代码:
<input type="radio" name="room" id="standard" class="left" value="standard" checked>Standard <input type="radio" name="room" id="business" class="left" value="business">Business <input type="radio" name="room" id="suite" class="left last" value="suite">Suite<br> <div id="select"></div>
- 代码细节不规范问题
- 你拼接的select标签里
class=bed没给属性值加引号,虽然部分浏览器能容错,但不符合HTML规范,容易出现解析异常,要写成class="bed" - 循环里的变量
i没有用let/const声明,会变成全局变量,埋下隐性bug - 你现在的逻辑只处理了standard选项的渲染,切到business、suite选项时没有清空容器、也没有对应渲染逻辑,会残留上一次渲染的内容
- 你拼接的select标签里
- 前置依赖检查
先按F12打开浏览器控制台,如果看到$ is not defined报错,说明你没有在JS代码之前引入jQuery库,先引入jQuery再执行自定义代码。
可直接运行的修复后完整JS代码
// 绑定name为room的单选按钮change事件,比全局匹配:radio性能更好 $("input[name='room']").change(function() { const selectedType = $(this).val(); const $container = $("#select"); // 每次切换先清空容器内容 $container.empty(); if (selectedType === 'standard') { let html = '<label>Select number of bed: </label>'; const bedSelect = '<select class="bed"><option value="1">1</option><option value="2">2</option></select>'; // 注:你原代码循环渲染2个床位数选择框,如果实际只需要1个,删掉for循环直接拼一次bedSelect即可 for (let i = 0; i < 2; i++) { html += bedSelect; } $container.html(html); } else if (selectedType === 'business') { // 补全商务房对应的下拉控件逻辑即可 $container.html('<label>Business room add-ons: </label><select><option value="projector">Projector</option><option value="printer">Printer</option></select>'); } else if (selectedType === 'suite') { // 补全套房对应的下拉控件逻辑即可 $container.html('<label>Suite benefits: </label><select><option value="breakfast">Free Breakfast</option><option value="jacuzzi">Private Jacuzzi</option></select>'); } })
额外提示:新手写jQuery事件回调优先用普通
function()写法,不要用箭头函数,箭头函数不会绑定当前触发元素的this上下文,后续要拿当前DOM元素时容易出错。
内容的提问来源于stack exchange,提问作者Nory Levi
相关产品推荐
相关产品推荐

