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

添加jQuery实现配送表单开关时的Select2渲染异常问题

问题解决:WooCommerce订单支付页配送州Select2标签不生成的问题

问题根源

你的代码先默认隐藏了配送地址容器,紧接着触发复选框的change事件。如果复选框默认未勾选,配送地址会一直处于隐藏状态——而Select2需要在元素可见的前提下才能正确初始化,隐藏元素的尺寸无法被计算,导致对应的Select2 span标签无法生成。

修复方案

调整初始化逻辑,先根据复选框的初始状态决定容器的显示/隐藏状态,再绑定事件;同时在显示容器后手动重新初始化Select2,确保下拉框能正常渲染。

修改后的代码:

jQuery( function( $ ) {
    var wc_order_review_form = {
        $order_review: $( '#order_review' ),
        $shipCheckbox: $( '#ship-to-different-address input' ),
        $shippingAddress: $( 'div.shipping_address' ),
        
        init: function() {
            // 先根据复选框初始状态设置容器可见性
            this.setShippingVisibility();
            // 绑定change事件,用$.proxy确保this指向正确
            this.$order_review.on( 'change', '#ship-to-different-address input', $.proxy( this.ship_to_different_address, this ) );
        },
        
        setShippingVisibility: function() {
            if ( !this.$shipCheckbox.is( ':checked' ) ) {
                this.$shippingAddress.hide();
            } else {
                this.$shippingAddress.show();
                // 初始化可见状态下的Select2
                this.initSelect2();
            }
        },
        
        ship_to_different_address: function() {
            if ( this.$shipCheckbox.is( ':checked' ) ) {
                this.$shippingAddress.slideDown( 'fast', function() {
                    // 滑动动画完成后,确保元素可见再初始化Select2
                    wc_order_review_form.initSelect2();
                } );
            } else {
                this.$shippingAddress.slideUp();
            }
        },
        
        initSelect2: function() {
            // 只针对未初始化的下拉框执行Select2初始化
            this.$shippingAddress.find( 'select' ).each( function() {
                if ( !$( this ).hasClass( 'select2-hidden-accessible' ) ) {
                    $( this ).select2();
                }
            } );
        }
    };
    wc_order_review_form.init();
} );

代码说明

  • 提前缓存DOM元素,避免重复查找DOM提升性能
  • setShippingVisibility方法先处理初始状态,默认未勾选时隐藏容器,勾选时直接显示并初始化Select2
  • 滑动显示完成后再初始化Select2,确保元素处于可见状态,Select2能正确计算尺寸生成标签
  • initSelect2方法做了判断,只初始化未被Select2处理过的下拉框,避免重复初始化导致的异常

内容的提问来源于stack exchange,提问作者social.reza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:05:54