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
}));
我在触发 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
}));