【问题标题】:Detecting when a document is "fully active"检测文档何时“完全活动”
【发布时间】:2021-08-24 15:01:28
【问题描述】:

在阅读各种 JavaScript API 的规范时,您可能会遇到这样的要求:文档必须“完全激活”才能使用它们。这是从规范中定义的含义: https://html.spec.whatwg.org/multipage/browsers.html#fully-active

尚不清楚的是如何知道文档是否完全处于活动状态。例如,WakeLock API 要求文档完全处于活动状态。如果文档未完全激活,则调用“WakeLock.request()”将拒绝返回的 Promise,并带有“NotAllowedError”错误对象。但是,还有其他原因,它可能会返回“NotAllowedError”,并且在给定情况下没有指定哪个原因。

那么,在尝试使用需要它的 API 之前,如何主动确定文档是否处于完全活动状态?

【问题讨论】:

标签: javascript


【解决方案1】:

页面中有一段:https://html.spec.whatwg.org/multipage/browsers.html#active-document

当 d 的浏览上下文不为空,d 的浏览上下文的活动文档为 d,并且 d 的浏览上下文是顶级浏览上下文,或者d 的浏览上下文的容器文档完全处于活动状态。

期待您的问题:

那么,在尝试使用需要它的 API 之前,我如何才能主动确定文档是否处于完全活动状态

让我们扩展规则:

  • d 的浏览上下文不为空
  • d 的浏览上下文的活动文档是 d
  • d 的浏览上下文是顶级浏览上下文,或者 d 的浏览上下文的容器文档处于完全活动状态

我认为可以将其翻译为该 javascript 代码,但我对此不是 100% 确定:

function isFullyActive(s /* self */) {
    return s.window !== null
    && s.document === s.window.document
    && (s.window.top === s.window || isFullyActive(s.window.parent));
}

// you can use in this way on a top level javascript:
isFullyActive(self)

我没有找到任何关于检查文档是否完全活动的事件或方法的 API/规范。

参考资料:

【讨论】:

  • 我正在研究你的代码。 'this' 的使用令人困惑,并且在不同的上下文中可能意味着不同的东西(你可能知道)。也许“自我”是一个更好的词。在顶级 JavaScript 执行上下文中也是“self === this”。
  • 另一个混淆点。规范说“d”是一个文档,但是如果“d”是一个文档,你的代码就不起作用。 (文档没有窗口属性)
  • 根据我的研究,似乎没有任何情况下“d.window”将为空。即使在工作人员(无窗口)上下文中,它也是未定义的。
  • 我想我修复了你的代码。至少 defaultView 属性可以为空。我只是不确定它什么时候会为空: function isFullyActive(d) { return d.defaultView !== null && d.defaultView.document === d && (d.defaultView.top === d.defaultView | | isFullyActive(d.defaultView.parent.document)); } isFullyActive(文档)
  • 剩下的唯一问题,我猜,如果函数将始终为全局文档对象返回 true,或者在什么情况下它可能为 false。
猜你喜欢
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
相关资源
最近更新 更多