Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 链接到带有散列片段的页面(这样用户就可以在页面上的特定内容上着陆)问题_Javascript_Html_Css_Angularjs - Fatal编程技术网

Javascript 链接到带有散列片段的页面(这样用户就可以在页面上的特定内容上着陆)问题

Javascript 链接到带有散列片段的页面(这样用户就可以在页面上的特定内容上着陆)问题,javascript,html,css,angularjs,Javascript,Html,Css,Angularjs,我想要的功能: 我想给一个用户一个像mysite.com/foobar这样的链接,这样当他们点击这个链接时,他们会在页面foo上着陆,并在页面上向下滚动到带有id栏的内容的一半。应该注意的是,此链接将始终从非现场单击或手动键入地址栏,用户将不会在页面上加载所有资产 另外,仅供参考,我正在使用angular和有问题的页面,每个内容位都在一个元素指令中,每个指令模板中都有图像 问题是: 很简单,对吧?嗯,我遇到了一些问题,大多数情况下它都能正常工作,但可能有40%的情况下它不能正常工作,用户会在内容

我想要的功能:

我想给一个用户一个像mysite.com/foobar这样的链接,这样当他们点击这个链接时,他们会在页面foo上着陆,并在页面上向下滚动到带有id栏的内容的一半。应该注意的是,此链接将始终从非现场单击或手动键入地址栏,用户将不会在页面上加载所有资产

另外,仅供参考,我正在使用angular和有问题的页面,每个内容位都在一个元素指令中,每个指令模板中都有图像

问题是:

很简单,对吧?嗯,我遇到了一些问题,大多数情况下它都能正常工作,但可能有40%的情况下它不能正常工作,用户会在内容上方着陆,我相信这是因为浏览器会滚动到页面上的正确点,但随后图像会加载到页面上方,将页面的其余部分向下推,让用户处于随机的非直观位置。由于某种原因,iPhone的故障率似乎更高

到目前为止,我所尝试的:

在run函数中,我在任何路由上查找哈希片段,如果它存在,则滚动到它

    if($location.hash()) {
        $anchorScroll();
    }
我试过:

在超时情况下包装它 这有时可以工作,但显然不一致,我可以将其设置为500毫秒,在良好的wifi连接上也可以,但在信号较差的手机上则不行

正在侦听$viewContentLoaded 速度太快,ui路由器似乎在呈现页面之前触发此事件

在页面上所有指令的每个post链接函数中发出事件

link: function ($scope) {
    $scope.$emit('loadingFinished');
然后在run函数中再次拾取该值

$scope.$on('loadingFinished', function () {
    $timeout(doAnchorScroll, 500);
}
这提高了成功率,但仍然不是万无一失的。我亲眼目睹了它让用户被困在主要是iPhone上的奇怪地点


有谁能建议一种方法来检测滚动的安全时刻,或者其他方法来确保在正确的位置着陆吗?

有两件事-首先是用户滚动应该阻止它-如果他们已经滚动,你不想滚动视图。第二个是监听图像以完成加载

收听图像非常容易:

$("img").one("load", $anchorScroll);
然后在$anchorScroll中,我建议检查是否所有图像都已加载,如果您只检查锚上方的图像,但只做一个快速回复,如果没有加分,则立即返回:

var scrolled = false;

function $anchorScroll() {
    var allLoaded = true;

    $("img").each(function() {
        if (!this.loaded) {
            return allLoaded = false;
        }
    });
    if (scrolled || !allLoaded) {
        return;
    }
    ...
滚动可能会稍微困难一些-您可以检查滚动事件,但不同平台之间的滚动事件略有不同-甚至可能会因手动滚动而被解雇-如果您发现发生这种情况,则只需使用一个全局设置,显示我正在此处滚动并忽略它,否则:

$(document).one("scroll", function() { // Use ".on" if this gets fired for code...
    scrolled = true;
});
请注意,您可能不需要关心失败的图像加载或已经加载的图像加载,因为您对$anchorScroll的初始调用将捕获它们