Scrolltop 函数 运行 两次

Scrolltop function running twice

我在触发 ajax 请求和响应的 select 元素上有一个 on change 函数。最近某个时候,它开始了 运行 两次,但不是更改触发器本身。只是更改功能中的所有内容。重复一下:更改功能只触发一次,但功能内容运行两次。这不是两周前发生的(上次我检查它),从那以后我没有更改任何相关代码。刚刚升级到 WordPress 4.5。这是代码(注释中有控制台日志信息):

$('body').on('change', 'select#users_view', function()
{
    var view = $(this).val();
    console.log('triggered '+view); // this only prints ONCE
    $('html, body').animate({scrollTop:0}, 250, function()
    {
        console.log('scroll top '+view); // this prints TWICE
        $.post(application_ajax.ajaxurl,{action:'application_ajax',dataType:'html',class:'views_users_management',method:'switch_view',view:view},function(response)
        {
            if('status' in response)
            {
                if(response.status == 'success') 
                {
                    console.log('success '+view); // this prints TWICE
                    $.ReplaceUsersContainer(response.html, false);
                }
                else if(response.status == 'error') $.showError(response.message);
                else $.showError();
            }
            else $.showError();
        });             
    });
});

到底是什么? javascript 文件只被加载一次。没有其他 javascript 文件在任何地方引用此 select 元素。如控制台日志所示,更改功能仅被触发一次。但由于某种原因,动画功能是 运行 两次。

编辑 我刚想到可能是 运行 两次,因为动画函数的 selector 是 html, body,但以前 jQuery 从来没有出现过这种情况,如果这就是 jQuery 现在正在做的,我有数千个 javascript 文件要修改。

哇,谢谢 jQuery。使用 html,body 作为 scrollTop 函数的选择器长期以来一直是我们很多人的标准做法,现在它的行为有所不同,我们都有很多工作要做。甚至 WORDPRESS 核心文件都在动画功能上使用 html,body

简而言之:在 jQuery v1.12.3 中,选择器 html,body 现在会使动画函数 运行 两次,而在之前的版本中,情况并非如此。

编辑感谢来自 Developer107 的以下第一条评论

由于 Firefox 需要 html 和 Chrome,等等需要 body,解决这个问题的方法是使用去抖功能。

我使用这个小插件:https://github.com/cowboy/jquery-throttle-debounce/

然后像这样调用我的函数:

$('html,body').animate({scrollTop:0}, 250, $.debounce(0, true, function()
{
    // do stuff
}));