热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

窗口。在Safari中,scrollTo异步工作?-Doeswindow.scrollToworkasynchronouslyinSafari?

RecentlyIfoundverystrange(inmyopinion)window.scrollTobehaviourinSafari(6.0.5(8536.30.1),

Recently I found very strange(in my opinion) window.scrollTo behaviour in Safari(6.0.5 (8536.30.1), MacOS 10.8.4). It seems it works asynchronously.

最近我发现窗户很奇怪(在我看来)。Safari中的scrollTo行为(6.0.5 (8536.30.1),MacOS 10.8.4)。它似乎是异步运行的。

My task sounds like:

我的任务听起来像:

  • make some absolute positioned div to be fixed positioned (pin it)
  • 将一些绝对定位div设置为固定位置(pin it)
  • do some page scroll
  • 做一些页面滚动
  • make previously modified div to be absolutely positioned back (unpin it)
  • 将先前修改过的div设置为绝对的后置(unpin)

So to unpin this div I have to execute unpin routine just after scroll modification is complete. And here I met the problem. Every browser I checked does it correctly except Safari.

因此,要解除这个div,我必须在完成滚动修改之后执行unpin例程。我遇到了这个问题。除了Safari浏览器,我检查过的每个浏览器都能正确运行。

Steps to reproduce:

重现步骤:

  1. Open any web page in Safari and make sure it is scrollable at least for 100px and it's initial scroll offset is 0
  2. 打开Safari中的任何网页,确保它至少可以滚动100px,并且它的初始滚动偏移量为0
  3. Open js console in dev tools
  4. 在开发工具中打开js控制台
  5. execute: window.scrollTo(0, 100); console.log(document.body.scrollTop);
  6. 执行:窗口。scrollTo(0,100);console.log(document.body.scrollTop);

The output is 0. But when I change this code to window.scrollTo(0, 100); window.setTimeout(function() {console.log(document.body.scrollTop)}, 1); the output is 100, as expected.

输出是0。但是当我把代码改成窗口时。scrollTo(0,100);window.setTimeout(函数(){ console.log(document.body.scrollTop)},1);输出是100,如预期的那样。

Here are all other browsers I've tested(where it works fine):

以下是我测试过的所有其他浏览器(运行良好):

  • Chrome 27.0.1453.110 (MacOS 10.8.4)
  • Chrome 27.0.1453.110(MacOS 10.8.4)
  • Firefox 21.0 (MacOS 10.8.4)
  • Firefox 21.0(MacOS 10.8.4)
  • Opera 12.15 b1748 (MacOS 10.8.4)
  • 歌剧12.15 b1748 (MacOS 10.8.4)
  • IE 8.0.7601.17514 (Win7)
  • IE 8.0.7601.17514(这个)

Well, as soon as my code sample is not cross browser, it's easier to check this behaviour on any web page with jQuery:

好吧,只要我的代码示例不是跨浏览器的,就可以用jQuery在任何网页上检查这种行为:

var $w = $(window); 
$w.scrollTop(100); 
console.log($w.scrollTop());

VS

VS

var $w = $(window); 
$w.scrollTop(100); 
window.setTimeout(function() {
    console.log($w.scrollTop())
}, 1);

Is this behavior is ok or is it a bug? How to handle it? (Now I modified $.fn.scrollTop to return $.Deferred instead of chaining and resolve it instantly in main thread in all browsers except Safari).

这种行为是ok的还是bug?如何处理它?(现在我修改.fn美元。scrollTop返回$。在除Safari之外的所有浏览器的主线程中,延迟而不是链接并立即解析它)。

2 个解决方案

#1


1  

I actually just tried and failed to reproduce your problem even with Safari 6.0.5 (on Lion, i.e. OS X 10.7).

实际上,我只是尝试了,甚至在Safari 6.0.5(在Lion上,也就是OS X 10.7)中,没有重现您的问题。

You can run this jsfiddle with https://www.browserstack.com/screenshots to confirm that it works with all Safari versions (5.1, 6.0, 6.1, 7, 8).

您可以使用https://www.browserstack.com/screenshots运行这个jsfiddle来确认它与所有Safari版本(5.1、6.0、6.1、7、8)兼容。

Indeed the spec says and I quote:

事实上,说明书上说,我引用:

When a user agent is to perform a smooth scroll of a scrolling box box to position, it must update the scroll position of box in a user-agent-defined fashion over a user-agent-defined amount of time. When the scroll is completed, the scroll position of box must be position. The scroll can also be aborted, either by an algorithm or by the user.

当用户代理要执行滚动框的平滑滚动来定位时,它必须在用户代理定义的时间内以用户代理定义的方式更新框的滚动位置。当滚动完成时,框的滚动位置必须为位置。滚动条也可以通过算法或用户中止。

Unless I am reading it wrong, Safari has its right to give you the old value (or indeed anything) while it is animating the scroll. Therefore your setTimeout approach may not even work fine if the browsers want to take it to the extreme.

除非我读错了,否则Safari有权在显示滚动时给你旧值(或者其他任何东西)。因此,如果浏览器希望将setTimeout方法发挥到极致,那么它甚至可能无法正常工作。

#2


0  

Setting scroll top in requestAnimationFrame actually solved my issue in browsers.

在requestAnimationFrame中设置scroll top实际上在浏览器中解决了我的问题。


推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了[从头学数学]中第101节关于比例的相关问题的研究和修炼过程。主要内容包括[机器小伟]和[工程师阿伟]一起研究比例的相关问题,并给出了一个求比例的函数scale的实现。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
author-avatar
Gravitymann
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有