You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript联动下拉选择修改输入框样式颜色不生效问题

问题根因

功能失效是多个问题叠加导致的:

  • ID冲突+重复渲染:模板里手写了id="buysell"的select标签,同时Django表单widget里又定义了id="floatingTransaction"的select配置,循环{% for type in form.transaction_type %}的写法会重复生成表单控件,JS查找的ID和实际触发事件的DOM元素不匹配
  • 事件未绑定:oninput事件写在了Django表单的widget配置里,但手写select标签的写法不会加载widget里配置的事件属性,事件从来没有被绑定到实际可见的下拉框上
  • 事件适配问题:oninput事件对select下拉选择场景兼容性差,优先用onchange监听选项变更
  • 判断逻辑隐患:直接读取option的text内容做判断,容易被渲染时产生的多余空格、特殊字符干扰,优先读option的value值判断
修复步骤(推荐直接复用Django表单渲染逻辑,冗余代码最少)
  1. 修改模板,删除手写的重复select标签,直接渲染表单字段,避免重复DOM和ID冲突:
<div class="transaction_type">
     <p>Transaction Type:</p>
     {{ form.transaction_type }}
</div>
<div>
  <p>Cost Basis ($):</p>
  {{ form.cost_basis }}
</div>
  1. 修改forms.py配置,把事件替换为适配下拉框的onchange,把行内字体样式移到attrs里统一配置:
transaction_choices = [
    ('BUY', 'Buy'),
    ('SELL', 'Sell'),
]
transaction_type = forms.CharField(
    max_length=4,
    widget=forms.Select(
        choices=transaction_choices,
        attrs={
            'class': 'form-select',
            'name': 'transaction_type',
            'id': 'floatingTransaction',
            'onchange': 'changeColor();',
            'style': 'font-size:16px'
        })
)

cost_basis = forms.DecimalField(
    min_value = 0,
    widget = forms.NumberInput(attrs={
            'class': 'form-control',
            'name': 'cost_basis',
            'id': 'costb',
        })
)
  1. 修改JS逻辑,匹配正确的元素ID,通过value判断选中项,增加页面初始化时的颜色设置:
function changeColor () {
    const transactionSelect = document.getElementById('floatingTransaction');
    const costInput = document.getElementById('costb');
    // 直接读取select的value,对应choices里存储的'BUY'/'SELL',避免文本匹配误差
    if (transactionSelect.value === 'BUY') {
        costInput.style.color = '#006400';
    } else {
        costInput.style.color = '#DC143C';
    }
}
// 页面加载完成后自动执行一次,适配默认选中项的颜色
document.addEventListener('DOMContentLoaded', changeColor);
可选方案(保留手写select标签的写法)

如果坚持手写select结构不使用Django自动渲染,需要把事件直接绑定到手写的标签上,同时正确渲染option的value属性:

<div class="transaction_type">
     <p>Transaction Type:</p>
     <select style="font-size:16px" class="form-select" id='buysell' required onchange="changeColor()">
           {% for value, label in form.transaction_type.field.choices %}
               <option value="{{ value }}">{{ label }}</option>
           {% endfor %}
     </select>
</div>

对应JS里把获取select的ID改回buysell即可,其余逻辑不变。

内容的提问来源于stack exchange,提问作者nicholas5538

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 18:39:27