window.pageYOffset 有时是 0 而不是有效值
window.pageYOffset is sometimes 0 instead of a valid value
我遇到一个问题,有时当我在网页中的 JavaScript 获得 window.pageYOffset
的值时,它莫名其妙地为 0,即使我知道用户正在查看文档的中间部分它的价值应该很大,比如 650000。请注意,大部分时间我得到的都是合理的价值。但有时它是零,有时它是一个看似随机的小值,比如在 6000 范围内,而我期望 650000。
而不是 post 一堆代码,我想问一些一般性问题来帮助我弄清楚从哪里开始看。
此页面显示在 iOS WKWebView
中(尽管此问题可能会在 Android 应用程序的类似上下文中出现)。 JavaScript 可以通过以下几种方式之一调用我的应用程序中的方法:
当我的应用程序收到页面已完成加载的通知(通过委托方法)时,它会使用 Objective-C 中的 evaluateJavaScript
调用 JavaScript 方法代码.
我的应用可以在其他时间调用 evaluateJavaScript
,而不仅仅是在页面完成加载时。
可能会调用 JavaScript 函数作为计时器触发的结果。
滚动事件可能会调用 JavaScript 函数。
我一直在假设页面上的JavaScript代码总是在单线程中运行。也就是说,我没有遇到计时器触发、滚动事件发生甚至来自 Objective-C 代码(使用 evaluateJavaScript
)的调用会中断 JavaScript 运行时。因此,在我尝试访问它时,我不必担心会中断某些正在修改 window.pageYOffset
的系统级 activity。
所以这是我的第一个问题:我的代码之外的某个人在单个线程上调用我的 JavaScript 方法而不是在另一个线程上使用 DOM 的方法是否正确?
我的第二个问题是相关的:我的代码修改了 DOM,添加和删除了 div
元素。我一直假设这些修改是同步的——如果我插入一个带有 insertAfter
或 insertBefore
的元素,我希望 child/parent/sibling 指针在 return 上是准确的,并且我假设我可以立即访问某些其他元素上的 top
和 left
值,并且它们将被更新以反映 inserted/removed 元素。关键是在进行更改之后和检查 window.pageYOffset
之类的内容之前,我不必 "wait" 将 DOM 更改为 "stabilize"。这是正确的吗?
还有一条线索:为了帮助缓解这种情况,我运气不错,只是在函数顶部测试 window.pageYOffset
是否为零。如果它为零,我会在计时器上给自己打电话(只有 1 毫秒的延迟)。如果我这样做的时间足够长,它最终将不为零。
也许读完所有这些后,none 的细节是相关的并且您知道基本问题的答案:为什么我有时会在 window.pageYOffset
中得到无效值(通常为 0)同一行代码在其他时间给出有效值。
问题是,从我给 WKWebView
一个新的 HTML 字符串来渲染到它告诉我加载完成之间似乎有一段时间现有页面仍处于活动状态的页面。在此期间,计时器继续触发,但某些 document
和 window
属性将无效。
由于在这种环境下调试 JavaScript 运行 很困难,我自欺欺人地想 "eventually pageYOffset
becomes valid" 而实际上我看到的是新页面最终完成了正在加载,正是这个新页面生成了对我的计时器函数的有效调用。
在我的特殊情况下(可能不适用于所有人)我能够在我的计时器函数顶部检测到 window.pageYOffset
的值,如果它为 0,则在短暂延迟后给自己回电。这使我能够处理由于某种原因 window.pageYOffset
尚未生效的情况(我的测试最终会通过并且我的计时器功能将照常继续)以及一切都在抛出过程中的情况离开以支持新页面(在这种情况下,计时器不会触发,因为页面消失了)。
我遇到一个问题,有时当我在网页中的 JavaScript 获得 window.pageYOffset
的值时,它莫名其妙地为 0,即使我知道用户正在查看文档的中间部分它的价值应该很大,比如 650000。请注意,大部分时间我得到的都是合理的价值。但有时它是零,有时它是一个看似随机的小值,比如在 6000 范围内,而我期望 650000。
而不是 post 一堆代码,我想问一些一般性问题来帮助我弄清楚从哪里开始看。
此页面显示在 iOS WKWebView
中(尽管此问题可能会在 Android 应用程序的类似上下文中出现)。 JavaScript 可以通过以下几种方式之一调用我的应用程序中的方法:
当我的应用程序收到页面已完成加载的通知(通过委托方法)时,它会使用 Objective-C 中的
evaluateJavaScript
调用 JavaScript 方法代码.我的应用可以在其他时间调用
evaluateJavaScript
,而不仅仅是在页面完成加载时。可能会调用 JavaScript 函数作为计时器触发的结果。
滚动事件可能会调用 JavaScript 函数。
我一直在假设页面上的JavaScript代码总是在单线程中运行。也就是说,我没有遇到计时器触发、滚动事件发生甚至来自 Objective-C 代码(使用 evaluateJavaScript
)的调用会中断 JavaScript 运行时。因此,在我尝试访问它时,我不必担心会中断某些正在修改 window.pageYOffset
的系统级 activity。
所以这是我的第一个问题:我的代码之外的某个人在单个线程上调用我的 JavaScript 方法而不是在另一个线程上使用 DOM 的方法是否正确?
我的第二个问题是相关的:我的代码修改了 DOM,添加和删除了 div
元素。我一直假设这些修改是同步的——如果我插入一个带有 insertAfter
或 insertBefore
的元素,我希望 child/parent/sibling 指针在 return 上是准确的,并且我假设我可以立即访问某些其他元素上的 top
和 left
值,并且它们将被更新以反映 inserted/removed 元素。关键是在进行更改之后和检查 window.pageYOffset
之类的内容之前,我不必 "wait" 将 DOM 更改为 "stabilize"。这是正确的吗?
还有一条线索:为了帮助缓解这种情况,我运气不错,只是在函数顶部测试 window.pageYOffset
是否为零。如果它为零,我会在计时器上给自己打电话(只有 1 毫秒的延迟)。如果我这样做的时间足够长,它最终将不为零。
也许读完所有这些后,none 的细节是相关的并且您知道基本问题的答案:为什么我有时会在 window.pageYOffset
中得到无效值(通常为 0)同一行代码在其他时间给出有效值。
问题是,从我给 WKWebView
一个新的 HTML 字符串来渲染到它告诉我加载完成之间似乎有一段时间现有页面仍处于活动状态的页面。在此期间,计时器继续触发,但某些 document
和 window
属性将无效。
由于在这种环境下调试 JavaScript 运行 很困难,我自欺欺人地想 "eventually pageYOffset
becomes valid" 而实际上我看到的是新页面最终完成了正在加载,正是这个新页面生成了对我的计时器函数的有效调用。
在我的特殊情况下(可能不适用于所有人)我能够在我的计时器函数顶部检测到 window.pageYOffset
的值,如果它为 0,则在短暂延迟后给自己回电。这使我能够处理由于某种原因 window.pageYOffset
尚未生效的情况(我的测试最终会通过并且我的计时器功能将照常继续)以及一切都在抛出过程中的情况离开以支持新页面(在这种情况下,计时器不会触发,因为页面消失了)。