【发布时间】:2017-03-20 09:14:43
【问题描述】:
更新:我在 plunkr 中重现了错误:请参阅 http://plnkr.co/BpYfCNBESUT6ZkiSZHgx
当您执行以下操作时会出现问题:
打开website。刷新网站,当您在浏览器选项卡中看到页面正在加载时,when you see the spinner in the tab。
切换到浏览器中的另一个选项卡。如果没有发生。再试一次。如果按照上述方式进行操作,您很可能会看到以下内容:
你可能会说,this is not such a big deal, you have to be real fast to let this error happen。但是,想象一下某个连接速度较慢的人,他转到浏览器中的另一个选项卡,继续观看他的 youtube 视频,同时网站正在加载。当他回来时,他只是看到页面一直在加载。
让我们说这个animation代码:
$pageloaderbar.animate({
width: "46%"
}, {
duration: 700,
complete: function () {
$scope.continue();
}
});
当第一个animation 完成时,它会调用一个名为$scope.continue(); 的新函数。看起来像这样:
$scope.continue = function () {
$timeout(function () {
$pageloaderbar.animate({
width: "100%"
}, {
duration: 500,
complete: function () {
$scope.PageIsLoading = false;
}
});
});
}
问题是,当用户在浏览器中切换选项卡时,在$pageloaderbar.animate 和$scope.continue 之间切换时,$plageloaderbar.animate 函数永远不会到达complete 函数。浏览器控制台显示以下错误(Chrome)
我的问题是,我如何查看网站上的用户是否为active?或者,即使browser tab 上的用户不是active,我如何仍能执行该功能?
因为似乎没有人有遮阳篷,所以我自己想出了一个小解决方法。但是,如果有人仍然可以解释为什么切换标签时animation 会中断,我非常高兴。
解决方法很简单,我只需要添加这段代码。
complete: function () {
if(document.hidden) {
$(window).on("blur focus", function () {
$scope.continue();
});
} else {
$scope.continue();
}
}
代替:
complete: function () {
$scope.continue();
}
【问题讨论】:
-
你能用 plunker/fiddle 重现这个吗?
-
对不起,在 sn-p 中它工作得很好。我也无法在本地开发环境中展示演示。
-
什么是$scope,为什么当前标签有焦点时没有定义它?你有没有追踪过它? $scope 的生命周期中发生了什么?我们无法从您提供的内容中看到很多内容,但这不应该以这种方式做出反应。 Console.log($scope) 在不同的地方,看看你发现了什么。
-
你能在这里添加相关代码吗?我认为
$scope.continue已被覆盖。可能是布尔值$scope.continue = false;。这就是为什么当你调用$scope.continue()时,它会抛出错误... is not a function。 -
@trevster344
$scope来自angular如果您有兴趣,这里是整个代码。也许对你有帮助:jsfiddle.net/3kc32zf3
标签: javascript jquery angularjs jquery-animate