在IE中,XPages和 Select2的列表框无法正常工作

前端开发 2026-07-09

带有Select2的标准列表框。
在Chrome中,点击会打开下拉菜单,点击下拉菜单外部会将其关闭。
在IE中,点击外部不会关闭下拉菜单,必须先选择其中一个值,才会在点击外部时关闭。
你可以用ESC关闭下拉框,但随后在页面上的任意位置点击都会重新触发下拉。
Select2 v4,有什么想法欢迎分享?

<xp:listBox id="lstPartnerRoles"
value="#{document1.PartnerRoles}" 
style="width: 30% !important;"
rendered="#{javascript:document1.isEditable()}" 
multiple="true">
<xp:selectItems>
<xp:this.value>
<![CDATA[#{javascript:var list = @DbLookup(@DbName(), "LookupKeywordLists", "Partner Roles", 2); return @Explode(list,",")}]]>
</xp:this.value>
</xp:selectItems>
</xp:listBox>
<xp:scriptBlock>
    <xp:this.value>
        <![CDATA[    $(document).ready(function() {
        x$("#{id:lstPartnerRoles}").select2({
    placeholder: "Select partner role(s)",
    closeOnSelect: false,
    });});  
        ]]>
    </xp:this.value>
</xp:scriptBlock>

解决方案

For anyone who's interested/has a similar issue, my resolution is as follows:

containerClicked flag — 通过对文档的mousedown事件来跟踪用户是否真正点击了Select2容器,从而阻止页面上其他元素触发重新打开

justClosed flag — 阻止IE在未选择任何值时造成的即时重新打开,并设定500ms的冷却时间

Transparent overlay — 位于下拉菜单后方,拦截外部点击,整洁地将其关闭

XSP.addOnLoad — 确保在页面发生局部刷新后,所有内容能够正确重新初始化

<xp:scriptBlock>
    <xp:this.value><![CDATA[

    function initPartnerRolesSelect2() {
        var $el = x$("#{id:lstPartnerRoles}");
        var justClosed = false;
        var containerClicked = false;

        if ($el.hasClass('select2-hidden-accessible')) {
            $el.select2('destroy');
        }
        $el.off('select2:open select2:close select2:opening');

        $el.select2({
            placeholder: "Select partner role(s)",
            closeOnSelect: false,
        });

        // Track whether the Select2 container was actually clicked
        $(document).on('mousedown.select2Track', function(e) {
            var target = e.target || e.srcElement;
            containerClicked = $(target).closest('.select2-container').length > 0;
        });

        $el.on('select2:opening', function(e) {
            if (justClosed || !containerClicked) {
                e.preventDefault();
            }
        });

        $el.on('select2:open', function() {
            justClosed = false;
            containerClicked = false;
            $('#select2Overlay').remove();
            $('<div id="select2Overlay"></div>').css({
                position: 'fixed',
                top: 0,
                left: 0,
                width: '100%',
                height: '100%',
                zIndex: 999,
                background: 'transparent'
            }).appendTo('body').on('click mousedown', function() {
                $('#select2Overlay').remove();
                justClosed = true;
                $el.select2('close');
                setTimeout(function() {
                    justClosed = false;
                }, 500);
            });
        });

        $el.on('select2:close', function() {
            $('#select2Overlay').remove();
        });
    }

    $(document).ready(function() {
        initPartnerRolesSelect2();
    });

    XSP.addOnLoad(function() {
        initPartnerRolesSelect2();
    });

    ]]></xp:this.value>
</xp:scriptBlock>
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章