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

APEX 21.1 多值自动联想输入框实现需求咨询

嘿,我之前在APEX 21.1里刚好做过这种多值标签式的输入,和你想要的Stack Overflow标签框、Bootstrap多值typeahead效果一模一样!给你拆解下具体实现步骤,都是亲测有效的:

步骤1:调整现有文本项的基础配置

你已经有了单值autocomplete的文本字段,先修改几个关键属性:

  • 存储设置:保持项类型为Text Field,如果绑定到数据库字段,确保字段是VARCHAR2类型(用来存逗号分隔的字符串)。
  • HTML属性:给这个项加个自定义CSS类(比如multi-tag-input),方便后续JS定位;同时指定分隔符的属性,示例:
    class="multi-tag-input" data-separator=","
    
    记得替换成你的页面项静态ID(比如P1_OFFICE_CODES)。
步骤2:编写自定义JS实现多值选择逻辑

核心是扩展APEX自带的autocomplete事件,阻止默认的单值替换,改成追加模式。在页面的Function and Global Variable Declaration里添加这段代码:

function initMultiTagAutocomplete() {
    // 替换成你的页面项静态ID
    const input = document.getElementById('P1_OFFICE_CODES');
    if (!input) return;

    // 监听autocomplete选中事件
    apex.jQuery(input).on('autocompleteselect', function(event, ui) {
        event.preventDefault(); // 阻止默认的单值覆盖行为
        const selectedValue = ui.item.value;
        // 拆分现有值为数组并去除空格
        const currentValues = input.value ? input.value.split(',').map(val => val.trim()) : [];
        
        // 避免重复添加相同的office code
        if (!currentValues.includes(selectedValue)) {
            currentValues.push(selectedValue);
            input.value = currentValues.join(', '); // 用逗号+空格分隔,更易读
        }
        
        // 自动添加分隔符并聚焦到末尾,方便继续输入
        setTimeout(() => {
            input.value += ', ';
            input.setSelectionRange(input.value.length, input.value.length);
        }, 10);
    });

    // 处理手动输入逗号的情况,自动去重和格式化
    input.addEventListener('blur', function() {
        const cleanedValues = this.value.split(',')
            .map(val => val.trim())
            .filter(val => val) // 过滤空值
            .filter((val, index, arr) => arr.indexOf(val) === index); // 去重
        this.value = cleanedValues.join(', ');
    });
}
步骤3:确保初始化函数正确触发

因为APEX的autocomplete是动态初始化的,所以要在页面加载完成后执行我们的函数。在页面的Execute When Page Loads里添加:

apex.jQuery(document).ready(function() {
    // 延迟一点确保autocomplete组件完全加载
    setTimeout(initMultiTagAutocomplete, 500);
    // 如果你的输入项在动态刷新的区域(比如对话框、动态区域),记得在区域刷新后重新调用initMultiTagAutocomplete()
});
步骤4:可选的CSS美化(贴近Stack Overflow标签样式)

如果想让输入框看起来更像标签输入而不是纯文本,可以在页面的Inline CSS里加这段样式:

.multi-tag-input {
    padding: 4px 8px;
    min-height: 36px;
    line-height: 1.5;
}
.multi-tag-input::placeholder {
    color: #666;
}

(如果想要完全的标签块效果,可以进一步修改JS,把选中的值生成带删除按钮的标签元素,这个看你视觉需求,上面的基础版已经满足功能要求)

测试验证点
  • 输入office code的部分字符,确认autocomplete下拉列表正常弹出
  • 选中选项后,值会追加到输入框,不会覆盖现有内容,且重复值不会被添加
  • 手动输入逗号分隔的多个值,失去焦点后会自动格式化、去重
  • 提交页面后,确认逗号分隔的值正确存储到对应的字段或页面项中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 04:07:40