jqGrid列编辑:计算maxLength时排除特殊字符的需求
解决输入字段maxLength忽略特殊字符的问题
我来帮你搞定这个需求——不管是amount字段的长度统计,还是inline编辑PackageCode时跳过decimalSeparator的计数,都可以通过自定义输入逻辑来实现,具体方案如下:
1. 调整amount字段的配置
你当前的editoptions里用了硬编码的maxlength:5,但这个会把逗号、空格这些分隔符也算入长度。要实现只统计数字的长度,我们可以替换默认的maxLength行为,改用实时输入处理:
{ name: "amount", width: 62, template: "number", formatter: "number", formatoptions: { decimalSeparator: ",", thousandsSeparator: " ", decimalPlaces: 4, defaultValue: '0.0000' }, editoptions: { type: "number", // 去掉默认maxlength,用dataInit绑定自定义处理 dataInit: function(elem) { $(elem).on('input', function() { // 过滤所有非数字字符,只保留有效数字 const pureDigits = $(this).val().replace(/[^0-9]/g, ''); // 限制有效数字长度为5 if (pureDigits.length > 5) { // 截断超出的数字,再用jqGrid的格式化工具还原分隔符显示 const truncatedDigits = pureDigits.slice(0, 5); const formattedValue = $.fn.fmatter('number', truncatedDigits, { decimalSeparator: ",", thousandsSeparator: " ", decimalPlaces: 4 }); $(this).val(formattedValue); } }); } } }
这个逻辑的核心是:每次输入时先提取纯数字,判断长度是否超限,若超限则截断后重新格式化,既保证数字长度符合要求,又不影响分隔符的正常显示。
2. 处理inline编辑的PackageCode字段
对于inline编辑的PackageCode字段,我们可以在编辑初始化时绑定同样的输入处理逻辑,跳过decimalSeparator的计数:
// 假设你的inline编辑初始化代码是这样的 $("#yourGridId").jqGrid('inlineNav', { edit: true, add: true, save: true, cancel: true, editParams: { beforeShowForm: function(form) { // 找到PackageCode的输入框 const codeInput = $("input[name='PackageCode']", form); // 绑定输入事件 codeInput.on('input', function() { // 这里替换成你的decimalSeparator,比如逗号 const separator = ","; // 过滤掉分隔符,统计纯有效字符长度 const cleanedValue = $(this).val().replace(new RegExp(`\\${separator}`, 'g'), ''); // 设置你需要的最大长度,比如10 const maxLength = 10; if (cleanedValue.length > maxLength) { // 截断后赋值(如果需要保留分隔符格式,同样可以用formatter处理) $(this).val(cleanedValue.slice(0, maxLength)); } }); } } });
如果是在列配置里直接设置,也可以给PackageCode的editoptions加上dataInit函数,和amount字段的处理方式完全一致。
核心思路梳理
- 不要用默认的
maxlength属性,因为它会统计所有输入字符 - 通过
input事件实时过滤掉特殊字符,只统计你需要的有效内容长度 - 超出限制时,截断有效内容后再按需还原格式,兼顾功能和显示效果
这样就能完美实现你要的:计算maxLength时跳过特殊字符,不管是常规字段还是inline编辑的场景。
内容的提问来源于stack exchange,提问作者saeed a
相关产品推荐
相关产品推荐

