Apex v20.1.0输入字段动态自定义禁用字符方案咨询
动态自定义禁用字符集的最优实现方案(Apex v20.1.0)
存储方案对比与选型
系统参数存储
- 优势:配置简单,读取速度快,适合禁用字符数量少、无需精细化管理的场景
- 劣势:字符集过长时维护不便,无法单独控制单个字符的启用/禁用状态
表存储
- 优势:支持精细化管理(可给字符加备注、单独启用/禁用),适合字符数量多或需频繁调整的场景
- 劣势:需额外数据库查询,可通过Apex缓存优化性能
根据需求,若无需单独管理单个字符,优先选系统参数存储;若需灵活控制每个禁用字符的状态,选表存储,两种方案都能实现无需修改代码即可动态更新禁用字符集。
系统参数存储实现步骤
创建应用级参数
进入Apex应用的「共享组件」→「应用程序属性」→「定义」,添加应用参数(如P_DISALLOWED_CHARS),值设为禁用字符组成的字符串(例如";,!")。修改JavaScript验证逻辑
在页面的「JavaScript」→「函数和全局变量声明」中添加以下代码:function checkDisallowedChars(e) { // 从应用参数获取禁用字符集 const disallowedChars = apex.item('P_DISALLOWED_CHARS').getValue(); // 获取按下的字符(兼容不同浏览器的键盘事件) const pressedChar = e.key || String.fromCharCode(e.keyCode || e.which); // 若字符在禁用列表中则阻止输入 return !disallowedChars.includes(pressedChar); } function checkPaste(e) { // 拦截粘贴操作中的禁用字符 const clipboardData = e.clipboardData || window.clipboardData; const pastedText = clipboardData.getData('text'); for (const char of disallowedChars) { if (pastedText.includes(char)) return false; } return true; }然后将输入字段的列属性修改为:
onkeypress="return checkDisallowedChars(event)" onpaste="return checkPaste(event)"
表存储实现步骤
创建禁用字符表
执行以下SQL创建存储禁用字符的表:CREATE TABLE DISALLOWED_CHARS ( CHAR_VALUE VARCHAR2(1) PRIMARY KEY, IS_ENABLED CHAR(1) DEFAULT 'Y' CHECK (IS_ENABLED IN ('Y','N')), DESCRIPTION VARCHAR2(100) );可通过Apex表单或SQL脚本维护表中数据。
创建AJAX回调进程
进入页面的「进程」→「创建」,选择「AJAX回调」进程,命名为GET_DISALLOWED_CHARS,PL/SQL代码如下:DECLARE l_chars VARCHAR2(200); l_cache_key VARCHAR2(50) := 'DISALLOWED_CHARS_CACHE'; BEGIN -- 优先从应用缓存读取,减少数据库查询 l_chars := apex.cache.get_item(l_cache_key); IF l_chars IS NULL THEN SELECT LISTAGG(char_value, '') WITHIN GROUP (ORDER BY char_value) INTO l_chars FROM disallowed_chars WHERE is_enabled = 'Y'; -- 缓存结果,有效期1小时(可根据需求调整) apex.cache.put_item(l_cache_key, l_chars, 3600); END IF; apex_json.open_object; apex_json.write('chars', l_chars); apex_json.close_object; END;修改JavaScript验证逻辑
在页面的「JavaScript」→「函数和全局变量声明」中添加以下代码:let disallowedChars = ''; // 页面加载时异步获取禁用字符集 apex.jQuery(document).ready(function() { apex.server.process('GET_DISALLOWED_CHARS', {}, { success: function(data) { disallowedChars = data.chars; } }); }); function checkDisallowedChars(e) { const pressedChar = e.key || String.fromCharCode(e.keyCode || e.which); return !disallowedChars.includes(pressedChar); } function checkPaste(e) { const clipboardData = e.clipboardData || window.clipboardData; const pastedText = clipboardData.getData('text'); for (const char of disallowedChars) { if (pastedText.includes(char)) return false; } return true; }输入字段的列属性同样设置为:
onkeypress="return checkDisallowedChars(event)" onpaste="return checkPaste(event)"
额外优化建议
- 浏览器兼容性:优先使用
e.key获取字符,比keyCode更可靠 - 缓存策略:表存储方案中可根据更新频率调整缓存有效期,减少数据库负载
- 前端反馈:可添加提示文本,当用户输入禁用字符时给出明确提示(例如通过Apex的
apex.message.showPageSuccess或自定义弹窗)
内容的提问来源于stack exchange,提问作者user19726169
相关产品推荐
相关产品推荐

