1

我现在正在尝试 Eliom,看看我能用它做什么。我想从我的 eliom 客户端代码中调用一个外部 javascript 库。我正在尝试的示例代码如下:

[%%client
  let three_lib = Js.Unsafe.js_expr "THREE" in

  let scene2 = Js.Unsafe.new_obj three_lib##.Scene [||] in

  let init () =
    (Firebug.console##log three_lib : unit);
    (Dom_html.window##alert (Js.string "scene2 created") : unit) in

  init()
]

相当于简单的javascript:

var scene2 = new THREE.Scene();
function init () {
  console.log(THREE);
  window.alert("scene2 created");
}
init();

从 OCaml 代码对 Three.js 的简单调用。现在,我还不能 100% 确定语法,但我观察到 THREE 是未定义的,因为这段代码是在加载 Three.js 之前执行的。

我该怎么做: 1)在 js_of_ocaml 生成的文件之前包含 js 文件;或者 2) 在生成的 js 文件中包含 Three.js;或 3) 其他选择?

目前,页面是这样生成的:

Eliom_tools.F.html
  ~title:"Main Page"
  ~js:[["lib";"three.min.js"]]
  Html5.D.(body .... )

先感谢您

4

1 回答 1

1

我找到了问题的根源和解决方案。

我发现问题在于默认情况下,js 脚本包含在“defer”属性中(因此在页面完全加载后进行解释)。

经过多次探索,我找到了一种在 OCaml 生成的 js之前使用解释的脚本生成页面的方法,它必须“手动”包含:

Eliom_tools.F.html
  ~title:"Main Page"
  ~other_head:[Html5.D.script ~a:[a_src 
    (Xml.uri_of_string "lib/three.min.js")] (pcdata "")]
  Html5.D.(body .... )
于 2016-06-11T14:01:55.307 回答