2

我将如何编写以下 JavaScript:

var element = document.querySelector('.element')
element.style.color = 'red'

合理?

到目前为止,我有:

[@@@bs.config {no_export: no_export}];

external document : Dom.document = "document" [@@bs.val];

external query_selector : Dom.document => string => Dom.element = "querySelector" [@@bs.send];

let element = query_selector document ".element";

这编译得很好。

但是我怎么能设置一个属性(即styleelement

4

2 回答 2

3

所以首先,这已经在bs-webapi中可用了。但是,如果您想重新创建(并简化)它,方法如下:

external document : Dom.document = "document" [@@bs.val];
external querySelector : string => option Dom.element = "" [@@bs.send.pipe: Dom.document] [@@bs.return null_to_opt];
external style : Dom.element => Dom.cssStyleDeclaration = "" [@@bs.get];
external setColor : Dom.cssStyleDeclaration => string => unit = "color" [@@bs.set];

let () =
    switch (document |> querySelector ".element") {
      | Some element => setColor (style element) "red";
      | None => ()
    };

您也可以将类型安全抛到窗外,然后这样做:

external document : Js.t {..} = "document" [@@bs.val];

let () = {
  let element = document##querySelector ".element";
  element##style##color #= "red"
};

但是我猜你这样做是为了学习,在这种情况下,后者将是一个糟糕的主意。

于 2017-08-22T20:46:27.953 回答
0

一种方法是:

[@@@bs.config {no_export: no_export}];

external document : Dom.document = "document" [@@bs.val];

external query_selector : Dom.document => string => Dom.element = "querySelector" [@@bs.send];

external set_attribute : Dom.element => string => string => unit = "setAttribute" [@@bs.send];

let element = query_selector document ".element";

set_attribute element "style" "color: red";

但是,我不确定是否有更好的方法。

笔记:

[@@@bs.config {no_export: no_export}];防止 Bucklescript 导出 ES6 模块。

Dom 模块提供了一堆类型。

未回答的问题:

  • 如何利用 Dom 模块的 attr 类型而不是使用字符串?
  • 如何利用 Dom 模块的 cssStyleDeclaration 类型而不是使用字符串?
于 2017-08-22T17:27:54.520 回答