1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#![no_std]
use js_ffi::*;

struct Dom {
    fn_query_selector: JSInvoker,
    fn_add_event_listener: JSInvoker,
}

impl Default for Dom {
    fn default() -> Self {
        Dom {
            fn_query_selector: js!(document.querySelector),
            fn_add_event_listener: js!(Node.prototype.addEventListener),
        }
    }
}

impl Dom {
    fn query_selector(&self, el: &JSObject, selector: &str) -> JSObject {
        JSObject(self.fn_query_selector.call_1(el, selector))
    }

    fn add_event_listener(&self, el: &JSObject, event_type: &str, callback: JSFunction) {
        self.fn_add_event_listener
            .call_2(el, event_type, callback);
    }
}

pub fn query_selector(el: &JSObject, selector: &str) -> JSObject {
    globals::get::<Dom>().query_selector(el, selector)
}

pub fn add_event_listener(el: &JSObject, event_type: &str, callback: JSFunction) {
    globals::get::<Dom>().add_event_listener(el, event_type, callback);
}