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

如何在jQuery Chosen插件新增选项时仅更新隐藏输入框?

解决jQuery Chosen动态新增选项的点击事件与更新问题

为什么直接绑定点击事件无效?

你遇到的是典型的动态DOM元素事件绑定问题:.create-option.active-result是Chosen在用户输入后动态生成的元素,页面初始加载时它并不存在,所以直接用$('.create-option.active-result').click()绑定事件不会生效——因为绑定动作执行时,目标元素还没被创建出来。


方案1:使用事件委托绑定点击事件

我们可以把事件委托给已经存在的父元素(比如Chosen生成的容器,甚至document),当点击事件冒泡到父元素时,再判断触发事件的目标是否是我们需要的“Add option”元素。

推荐的高效写法(委托给Chosen容器)

Chosen会在原select元素后面生成一个带有.chosen-container类的容器,直接委托给这个容器更高效:

// 绑定到Chosen的容器,减少事件冒泡范围
$('#element').next('.chosen-container').on('click', '.create-option.active-result', function() {
    // 从li文本中拆分出用户输入的新增选项内容
    var newOptionText = $(this).text().split(': ')[1];
    // 更新你的隐藏输入框
    $('#your-hidden-input-id').val(newOptionText);
    
    // 如果需要确保Chosen渲染最新选项,可手动触发更新
    // $('#element').trigger('chosen:updated');
});

通用写法(委托给document)

如果不确定Chosen容器的结构,也可以直接委托给document:

$(document).on('click', '.create-option.active-result', function() {
    var newOptionText = $(this).text().replace('Add option: ', '');
    alert('新增的选项内容:' + newOptionText);
    // 执行隐藏输入框更新逻辑
});

方案2:检测选择列表长度变化(MutationObserver)

如果你想通过监听选项数量变化来触发更新,可以使用浏览器原生的MutationObserverAPI,它能监听DOM元素的子节点变化(比如新增了option元素):

var $select = $('#element');
var selectDom = $select[0];
var previousOptionCount = $select.find('option').length;

// 创建观察者实例
var observer = new MutationObserver(function(mutations) {
    mutations.forEach(function(mutation) {
        // 检测是否有新的option被添加
        if (mutation.addedNodes.length > 0) {
            var currentOptionCount = $select.find('option').length;
            if (currentOptionCount > previousOptionCount) {
                // 获取最新添加的选项文本
                var newOptionText = $(mutation.addedNodes[0]).text();
                // 更新隐藏输入框
                $('#your-hidden-input-id').val(newOptionText);
                // 更新计数
                previousOptionCount = currentOptionCount;
            }
        }
    });
});

// 配置观察者:监听select的子节点变化
observer.observe(selectDom, { childList: true });

另外,也可以结合Chosen提供的chosen:updated事件,当Chosen更新选项后会触发这个事件:

$('#element').on('chosen:updated', function() {
    var optionCount = $(this).find('option').length;
    console.log('当前选项数量:' + optionCount);
    // 这里可以结合之前保存的计数,判断是否新增了选项并更新输入框
});

小提示

当用户点击“Add option”后,Chosen会自动把新选项添加到原select元素中,你也可以在点击事件中延迟一点获取原select的最后一个option文本,确保准确性:

$('#element').next('.chosen-container').on('click', '.create-option.active-result', function() {
    // 延迟100ms,确保Chosen完成选项添加操作
    setTimeout(function() {
        var lastOptionText = $('#element').find('option:last').text();
        $('#your-hidden-input-id').val(lastOptionText);
    }, 100);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:05:12