热门标签 | 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实际上在浏览器中解决了我的问题。


推荐阅读
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 本文详细探讨了使用纯JavaScript开发经典贪吃蛇游戏的技术细节和实现方法。通过具体的代码示例,深入解析了游戏逻辑、动画效果及用户交互的实现过程,为开发者提供了宝贵的参考和实践经验。 ... [详细]
  • 本文探讨了如何通过检测浏览器类型来动态加载特定的npm包,从而优化前端性能。具体而言,仅在用户使用Edge浏览器时加载相关包,以提升页面加载速度和整体用户体验。此外,文章还介绍了实现这一目标的技术细节和最佳实践,包括使用User-Agent字符串进行浏览器识别、条件加载策略以及性能监控方法。 ... [详细]
  • 如何在ES6中实现Promise的完整流程
    在ES6中,Promise是一种用于处理异步操作的数据结构,它代表了一个现在、将来或永远可能可用的结果。本文将详细介绍如何在ES6中实现Promise的完整流程,包括创建、链式调用、错误处理等关键步骤,帮助开发者更好地理解和应用这一重要的异步编程工具。 ... [详细]
  • 深入解析 JavaScript 代码执行流程:理解执行上下文与变量提升机制
    本文深入探讨了JavaScript代码的执行流程,重点解析了执行上下文和变量提升机制。通过详细分析代码解析过程,帮助开发者更好地理解JavaScript中的作用域和执行环境,为编写高效、无误的代码提供理论支持。 ... [详细]
  • HTML5 Web存储技术是许多开发者青睐本地应用程序的重要原因之一,因为它能够实现在客户端本地存储数据。HTML5通过引入Web Storage API,使得Web应用程序能够在浏览器中高效地存储数据,从而提升了应用的性能和用户体验。相较于传统的Cookie机制,Web Storage不仅提供了更大的存储容量,还简化了数据管理和访问的方式。本文将从基础概念、关键技术到实际应用,全面解析HTML5 Web存储技术,帮助读者深入了解其工作原理和应用场景。 ... [详细]
  • 本文旨在构建一个JavaScript函数,用于对用户输入的电子邮件地址和密码进行有效性验证。该函数将确保输入符合标准格式,并检查密码强度,以提升用户账户的安全性。通过集成正则表达式和条件判断语句,该方法能够有效防止常见的输入错误,同时提供即时反馈,改善用户体验。 ... [详细]
  • Webpack 初探:Import 和 Require 的使用
    本文介绍了 Webpack 中 Import 和 Require 的基本概念和使用方法,帮助读者更好地理解和应用模块化开发。 ... [详细]
  • 使用 Vuex 管理表单状态:当输入框失去焦点时自动恢复初始值 ... [详细]
  • 字节码开发笔记:深入解析与应用技巧 ... [详细]
  • TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得
    TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得 ... [详细]
  • 在前一篇文章中,我们介绍了如何使用Requests库发送GET请求。本文将深入探讨如何通过Requests库发送POST请求,包括参数格式、请求封装等关键技巧,并通过“历史上的今天”API实例进行详细说明。 ... [详细]
  • 本文详细解析了如何利用Appium与Python在真实设备上执行测试示例的方法。首先,需要开启手机的USB调试功能;其次,通过数据线将手机连接至计算机并授权USB调试权限。最后,在命令行工具中验证设备连接状态,确保一切准备就绪,以便顺利进行测试。 ... [详细]
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社区 版权所有