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

如何在Odoo 16中使用JavaScript监听字段事件?(代码尝试后报错)

Odoo 16 自定义字段Widget监听按键事件报错排查与修复

报错原因分析

  • 重复加载JS资源:同时在manifest.py和assets.xml中配置加载同一份JS文件,导致脚本重复引入,引发变量冲突或加载异常。
  • 正则表达式语法错误:/[0-9C/F]/中的/是正则表达式的分隔符,未转义会被解析为正则结束标记,直接导致语法报错。
  • 缺少Underscore依赖:代码使用_.extend但未显式引入Underscore库,Odoo 16需手动声明该依赖。
  • 事件绑定范围问题:直接绑定keypress事件到Widget根节点,可能触发非输入框元素的事件,引发不必要的干扰。

修复方案

1. 清理重复的资源配置

删除views/assets.xml文件,或者注释掉其中添加JS脚本的代码,仅保留manifest.py中的assets配置即可,避免重复加载。

2. 修正JavaScript代码

odoo.define('circulacion.campo_nit', function (require) {
    "use strict";

    var _ = require('web.utils');
    var fieldRegistry = require('web.field_registry');
    var FieldChar = require('web.basic_fields').InputField;

    var CampoNit = FieldChar.extend({
        events: _.extend({}, FieldChar.prototype.events || {}, {
            'keypress .o_input': '_onKeyPress', // 限定监听输入框元素,避免事件冒泡
        }),

        _onKeyPress: function (event) {
            var input = String.fromCharCode(event.which);
            // 转义/,允许数字、C、F、斜杠
            if (!/[0-9CF\/]/.test(input)) {
                event.preventDefault();
            }
        },
    });

    fieldRegistry.add('campo_nit', CampoNit);

    return CampoNit;
});

3. 调整manifest.py配置

"depends": ["base", "web"],  # 新增web依赖,确保基础前端库加载完整
'assets': {
    'web.assets_backend': [
        'circulacion/static/src/js/assets.js',
    ]
},
"data": [
    # "views/assets.xml",  # 移除该行,避免重复加载
    "security/ir.model.access.csv",
    "views/views.xml",
    "views/templates.xml",
],

4. 表单视图使用保持不变

<field name="nit" widget="campo_nit" />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 04:54:59