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

JavaScript中onchange事件获取this.value返回undefined问题求助

问题:JavaScript获取Django表单输入框值返回undefined

我尝试通过JavaScript获取表单输入框的值,但控制台输出undefined,相关代码如下:

HTML代码

<td onchange="validate_hours(this)">{{ form.monday }}</td>

JavaScript代码

function validate_hours(elem) {
   console.log(elem.value)
}

Django表单字段{{ form.monday }}渲染后的实际HTML为:

<input type="number" name="form-0-monday" value="4.0" step="any" placeholder="0.0" id="id_form-0-monday">

问题原因

你把onchange事件绑定在了<td>元素上,而<td>本身并没有value属性,所以打印elem.value自然会得到undefined。实际的输入值存储在<td>内部的<input>标签里。

解决方案

方案1:直接给Django表单输入框绑定事件

在Django表单定义时,给字段的widget添加onchange属性,让事件直接绑定到输入框上:

class YourForm(forms.Form):
    monday = forms.FloatField(
        widget=forms.NumberInput(attrs={
            'onchange': 'validate_hours(this)',
            'step': 'any',
            'placeholder': '0.0'
        })
    )

此时HTML会渲染成带onchange的输入框,函数中的this指向输入框本身,就能正确获取value。

方案2:修改JavaScript函数,从<td>中获取输入框

如果不想修改表单定义,调整函数逻辑,从传入的<td>元素中找到子输入框:

function validate_hours(elem) {
    const inputElem = elem.querySelector('input');
    if (inputElem) {
        console.log(inputElem.value);
    }
}

方案3:使用事件委托(推荐)

给包含这些<td>的表格绑定事件,通过事件冒泡来捕获输入框的change事件,适合动态生成的表单:

document.querySelector('table').addEventListener('change', function(e) {
    const target = e.target;
    // 筛选出目标输入框
    if (target.tagName === 'INPUT' && target.id.includes('monday')) {
        console.log(target.value);
    }
});

这种方式不需要给每个<td>或输入框单独绑定事件,维护更方便。


内容的提问来源于stack exchange,提问作者Carlos S. C.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:20:33