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

如何在WordPress子主题JS中禁用计数器盒子的jQuery动画?

问题

现有一个WordPress网站,所有修改均在子主题中进行。网站部分页面包含计数器盒子,元素进入视口时数字会从0计数到设定值,其HTML结构如下:

<div class="fusion-column-wrapper">
    <div class="fusion-counters-box counters-box fusion-columns-4">
        <div class="fusion-counter-box fusion-column col-counter-box counter-box-wrapper" data-animationoffset="100%">
            <div class="counter-box-container">
                <div class="content-box-percentage content-box-counter">
                    <i class="counter-box-icon fontawesome-icon fa fa-suitcase" aria-hidden="true"></i>
                    <span class="display-counter" data-value="87342" data-direction="up" data-decimals="0">87342</span>
                </div>
                <div class="counter-box-content">PLAQUES POSEES</div>
            </div>
        </div>

        <!-- other columns -->

    </div>
</div>

需求是禁用所有计数器盒子的动画效果,直接显示最终数值。

运行动画的JS脚本位于主题配套插件fusion-builder的fusion-counters-box.js中,核心代码如下:

!function (o) { "use strict"; o.fn.$fusionBoxCounting = function () { var n = o(this).data("value"), e = o(this).data("direction"), i = o(this).data("delimiter"), t = 0, u = n, r = fusionCountersBox.counter_box_speed, s = Math.round(fusionCountersBox.counter_box_speed / 100); i || (i = ""), "down" === e && (t = n, u = 0), o(this).countTo({ from: t, to: u, refreshInterval: s, speed: r, formatter: function (o, n) { return "-0" === (o = (o = o.toFixed(n.decimals)).replace(/\B(?=(\d{3})+(?!\d))/g, i)) && (o = 0), o } }) } }(jQuery), jQuery(window).on("load fusion-element-render-fusion-counters_box", function (o, n) { (void 0 !== n ? jQuery('div[data-cid="' + n + '"]').find(".fusion-counter-box").not(".fusion-modal .fusion-counter-box") : jQuery(".fusion-counter-box").not(".fusion-modal .fusion-counter-box")).each(function () { var o = jQuery(this), n = getWaypointOffset(jQuery(this)); o.waypoint(function () { o.find(".display-counter").each(function (o, n) { jQuery(n).$fusionBoxCounting() }), this.destroy() }, { offset: n }) }), jQuery(".fusion-modal .fusion-counter-box").on("appear", function () { jQuery(this).find(".display-counter").each(function () { jQuery(this).$fusionBoxCounting() }) }) }), jQuery(window).on("fusion-element-render-fusion_counter_box", function (o, n) { jQuery('div[data-cid="' + n + '"]').find(".display-counter").each(function () { jQuery(this).$fusionBoxCounting() }) });

直接修改插件文件会在插件更新后丢失改动,尝试在子主题JS文件中添加以下代码但无效:

(function($){

    $(document).ready(function(){

        /** 
         * Disable Animation
         */

        $(".display-counter").on( "appear", function(){

            jQuery.fx.off = true; // right now it doesn't give any effect

        });

    });

})(jQuery);

请问该需求是否可行?若可行,正确的实现方式是什么?

解决方案

这个需求完全可行,以下是几种在子主题JS中实现的可靠方法,均不会受插件更新影响:

方法1:重写$fusionBoxCounting方法(推荐)

直接覆盖原插件定义的$fusionBoxCounting方法,让它直接显示最终数值,不执行动画:

(function($) {
    $(window).on('load', function() {
        // 重写计数方法,直接设置为目标值
        $.fn.$fusionBoxCounting = function() {
            $(this).text($(this).data('value'));
        };
    });
})(jQuery);

原理:原插件的动画逻辑完全依赖这个自定义方法,重写后所有调用该方法的地方都会直接显示最终数值,无需修改其他逻辑。

方法2:阻止Waypoint触发动画

原插件通过Waypoint监听元素是否进入视口,触发动画。可以移除Waypoint或者阻止其回调执行:

(function($) {
    $(window).on('load fusion-element-render-fusion-counters_box', function(event, cid) {
        var $counters = cid ? 
            $('div[data-cid="' + cid + '"]').find('.fusion-counter-box').not('.fusion-modal .fusion-counter-box') :
            $('.fusion-counter-box').not('.fusion-modal .fusion-counter-box');
        
        // 移除已绑定的waypoint
        $counters.each(function() {
            $(this).waypoint('destroy');
            // 直接设置最终数值
            $(this).find('.display-counter').text($(this).find('.display-counter').data('value'));
        });

        // 处理模态框内的计数器
        $('.fusion-modal .fusion-counter-box').off('appear').on('appear', function() {
            $(this).find('.display-counter').text($(this).find('.display-counter').data('value'));
        });
    });

    // 处理动态渲染的计数器
    $(window).off('fusion-element-render-fusion_counter_box').on('fusion-element-render-fusion_counter_box', function(event, cid) {
        $('div[data-cid="' + cid + '"]').find('.display-counter').each(function() {
            $(this).text($(this).data('value'));
        });
    });
})(jQuery);

原理:先销毁原插件绑定的Waypoint,避免触发动画,同时直接设置计数器的文本为目标值;另外覆盖动态渲染事件的处理逻辑,确保动态加载的计数器也无动画。

方法3:直接替换计数器文本(简单粗暴)

如果不需要考虑动态渲染的计数器,也可以在页面加载后直接替换所有计数器的文本:

(function($) {
    $(window).on('load', function() {
        $('.display-counter').each(function() {
            $(this).text($(this).data('value'));
        });
    });

    // 处理动态加载的计数器
    $(document).on('fusion-element-render-fusion-counters_box fusion-element-render-fusion_counter_box', function(event, cid) {
        var $targets = cid ? $('div[data-cid="' + cid + '"]').find('.display-counter') : $('.display-counter');
        $targets.each(function() {
            $(this).text($(this).data('value'));
        });
    });
})(jQuery);

原理:不管动画是否触发,直接把计数器的文本设置为data-value里的最终值,即使动画启动也会被立刻覆盖。

注意事项

  • 确保子主题的JS文件在插件的fusion-counters-box.js之后加载(WordPress中默认子主题脚本优先级低于插件,若有问题可通过wp_enqueue_script的$deps参数指定依赖fusion-counters-box)。
  • 测试时清空缓存,避免旧脚本影响结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 14:34:50