2016-06-07 64 views
0

我現在正在嘗試Eliom,看看我能用它做些什麼。 我想從我的eliom客戶端代碼中調用外部JavaScript庫。 我想要的代碼示例如下:從Eliom客戶端代碼調用外部Js庫

[%%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所。 現在,我還沒有完全確定語法,但是我觀察到的是THREE未定義,因爲在加載Three.js之前執行了此代碼。

我該如何:1)將js文件包含在js_of_ocaml生成的文件之前;或2)在生成的js文件中包含Three.js;或3)其他選項?

目前,該頁面會產生這樣:

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

預先感謝您

回答

0

我發現我的問題和解決方案的由來。

我發現這個問題是這樣的事實:在默認情況下,JS腳本包含了「推遲」屬性(從而解釋後的頁面完全加載)。

多探測後,我找到了一種方法來生成一個腳本的頁面演繹得以前的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 ....)