dom - 从 DOM 中选择元素 - Reasonml/BuckleScript querySelector

标签 dom reason bucklescript

如何使用 Reason 从 DOM 中选择项目。我正在使用 bs-webapi 进行 DOM 绑定(bind),这就是我想要做的:

let parent = document |> Document.querySelector(".parent");
let child = Element.querySelector(".child", parent);

但是,BuckleScript 会提示,因为父级的类型不正确。它说父级的类型为option(Dom.element),父级预计为Dom.element.t。我是 Reason 的新手,正在努力学习。我不明白 option(Dom.element) 的含义或如何使上面的代码块起作用。非常感谢任何帮助

最佳答案

您需要解开选项变体,我们可以通过开关来完成此操作并使用内置的 None/Some 变体。

您可以在此处找到有关选项变体的一些文档:https://reasonml.github.io/docs/en/newcomer-examples.html#using-the-option-type

以下是有关选项的更多文档:https://reasonml.github.io/docs/en/variant.html#option

为此,您可以将代码更改为如下所示:

let parent = document |> Document.querySelector(".parent");
let child = switch (parent) {
  | Some(p) => switch (Element.querySelector(".child", p)) {
    | Some(c) => c
    | None => raise(Failure("Unable to find child selector"))
  }
  | None => raise(Failure("Unable to find parent selector"))
};

如果您想登录到控制台而不是失败,则需要返回有效的 Dom.element.t,可能如下所示:

let emptyEl = document |> Document.createElement("noscript");
let parent = document |> Document.querySelector(".parent");
let child = switch (parent) {
  | Some(p) => switch (Element.querySelector(".child", p)) {
    | Some(c) => c
    | None => {
      Js.log("Unable to find child selector");
      emptyEl;
    }
  }
  | None => {
    Js.log("Unable to find parent selector");
    emptyEl;
  }
};

然后,您需要检查您的子元素是否为 noscript,以查看是否找到了您要查找的子元素。

关于dom - 从 DOM 中选择元素 - Reasonml/BuckleScript querySelector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48230991/

相关文章:

php - 在 JavaScript 中嵌入 PHP

polymorphism - 如何柯里化(Currying)带有可选参数的函数,以在 ReasionML/BuckleScript 中生成 Js.t 对象?

ocaml - 是否可以使用模块动态创建多态变体类型?

reason - Reason 中的 .() 和 .{} 有什么区别?

syntax - 在 ReasonML 中的最后一个管道之后使用快速管道运算符编译错误

javascript - 根据输入范围值显示/隐藏 DOM 元素

java - 使用 JSOUP 选择特定的 HTML 表

javascript - 如何将 DOM 元素传递给 "ng-disabled"

django - graphql reason-apollo - 选项的递归解析

namespaces - 全命名空间需要重新编译