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

Apex v20.1.0输入字段动态自定义禁用字符方案咨询

动态自定义禁用字符集的最优实现方案(Apex v20.1.0)

存储方案对比与选型

系统参数存储

  • 优势:配置简单,读取速度快,适合禁用字符数量少、无需精细化管理的场景
  • 劣势:字符集过长时维护不便,无法单独控制单个字符的启用/禁用状态

表存储

  • 优势:支持精细化管理(可给字符加备注、单独启用/禁用),适合字符数量多或需频繁调整的场景
  • 劣势:需额外数据库查询,可通过Apex缓存优化性能

根据需求,若无需单独管理单个字符,优先选系统参数存储;若需灵活控制每个禁用字符的状态,选表存储,两种方案都能实现无需修改代码即可动态更新禁用字符集。


系统参数存储实现步骤

  1. 创建应用级参数
    进入Apex应用的「共享组件」→「应用程序属性」→「定义」,添加应用参数(如P_DISALLOWED_CHARS),值设为禁用字符组成的字符串(例如";,!")。

  2. 修改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)"
    

表存储实现步骤

  1. 创建禁用字符表
    执行以下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脚本维护表中数据。

  2. 创建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;
    
  3. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:01:04