1

作为将 scalaJS 从 0.6.x 升级到 1.4.0 的一部分,我正在将 scalatags 从 0.6.7 升级到 0.9.3。

在我的一些测试中出现以下错误:

scala.scalajs.js.JavaScriptException: TypeError: $m_Lorg_scalajs_dom_package$(...).document__Lorg_scalajs_dom_raw_HTMLDocument(...).createRange is not a function

跟踪代码,我相信它发生在执行 `scalatags.JsDom 中以下 scalatags 代码的第 141 行时:

冒犯的scalatags代码

我将调用提取createRange到单独的测试中并得到相同的错误。打印了“创建范围”;“创建的范围”不是,它产生了与上面相同的异常。

隔离测试

createRange()是本机功能。

谷歌搜索“createRange 不是函数”会产生许多类似的问题,似乎都与测试有关(但与 ScalaJS 无关)。他们中的许多人表示“修复”是document用你自己版本的createRange. 真的吗?

我最初认为这是 scalatags 的问题。然后我认为它与 scalajs 库有关。现在我认为它与 Node.js 有关,尽管 Google 没有生产任何确凿证据。

关于如何进行的建议?尝试猴子补丁document

4

1 回答 1

0

document.createRange总结:使用Node.js进行测试时,jsdom似乎缺少该功能。其他语言的其他人也有类似的问题

以下猴子补丁对我有用。在开发这个之后,我注意到Facade Types有一个关于猴子类型的部分。

此外,解决此错误的库代码(scalatags)实际上调用了document.createRange().createContextualFragment(v). 所以我也需要为此提供一些东西。

  import scala.scalajs.js
  import org.scalajs.dom.document
  js.Dynamic.global.document.createRange = () ⇒
    js.Dynamic.literal(
      setStart = () => js.Dynamic.literal(),
      setEnd   = () => js.Dynamic.literal(),
      commonAncestorContainer = js.Dynamic.literal(
        nodeName      = "BODY",
        ownerDocument = document
      ),
      createContextualFragment = (v: String) ⇒ {
        val p = document.createElement("p")
        p.appendChild(document.createTextNode(v))
      }
    )
于 2021-01-29T17:47:25.560 回答