Skip to content

Commit b88dbb7

Browse files
clembuhhugo
authored andcommitted
Lib: Add support for 'addEventListener' with options (#807)
1 parent c8ff2a6 commit b88dbb7

File tree

5 files changed

+55
-7
lines changed

5 files changed

+55
-7
lines changed

CHANGES

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
** Misc: remove cppo dependency
1212
** Misc: remove ppx_tools_versioned dependency in ppx_deriving_json
1313
** Misc: support for ocaml 4.09
14+
** Lib: Add support for 'addEventListener' with options
1415

1516
* Bug fixes:
1617
** Compiler: don't generate source if no-source-map passed (#780)

lib/js_of_ocaml/dom.ml

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,16 +352,37 @@ end
352352

353353
type event_listener_id = unit -> unit
354354

355-
let addEventListener (e : (< .. > as 'a) t) typ h capt =
355+
class type event_listener_options =
356+
object
357+
method capture : bool t writeonly_prop
358+
359+
method once : bool t writeonly_prop
360+
361+
method passive : bool t writeonly_prop
362+
end
363+
364+
let addEventListenerWithOptions (e : (< .. > as 'a) t) typ ?capture ?once ?passive h =
356365
if (Js.Unsafe.coerce e)##.addEventListener == Js.undefined
357366
then
358367
let ev = (Js.string "on")##concat typ in
359368
let callback e = Js.Unsafe.call (h, e, [||]) in
360369
let () = (Js.Unsafe.coerce e)##attachEvent ev callback in
361370
fun () -> (Js.Unsafe.coerce e)##detachEvent ev callback
362371
else
363-
let () = (Js.Unsafe.coerce e)##addEventListener typ h capt in
364-
fun () -> (Js.Unsafe.coerce e)##removeEventListener typ h capt
372+
let opts : event_listener_options t = Js.Unsafe.obj [||] in
373+
let iter t f =
374+
match t with
375+
| None -> ()
376+
| Some b -> f b
377+
in
378+
iter capture (fun b -> opts##.capture := b);
379+
iter once (fun b -> opts##.once := b);
380+
iter passive (fun b -> opts##.passive := b);
381+
let () = (Js.Unsafe.coerce e)##addEventListener typ h opts in
382+
fun () -> (Js.Unsafe.coerce e)##removeEventListener typ h opts
383+
384+
let addEventListener (e : (< .. > as 'a) t) typ h capt =
385+
addEventListenerWithOptions e typ ~capture:capt h
365386

366387
let removeEventListener id = id ()
367388

lib/js_of_ocaml/dom.mli

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -334,15 +334,27 @@ module Event : sig
334334
val make : string -> 'a typ
335335
end
336336

337+
val addEventListenerWithOptions :
338+
(< .. > t as 'a)
339+
-> 'b Event.typ
340+
-> ?capture:bool t
341+
-> ?once:bool t
342+
-> ?passive:bool t
343+
-> ('a, 'b) event_listener
344+
-> event_listener_id
345+
(** Add an event listener. This function matches the
346+
option-object variant of the [addEventListener] DOM method,
347+
except that it returns an id for removing the listener. *)
348+
337349
val addEventListener :
338350
(< .. > t as 'a)
339351
-> 'b Event.typ
340352
-> ('a, 'b) event_listener
341353
-> bool t
342354
-> event_listener_id
343355
(** Add an event listener. This function matches the
344-
[addEventListener] DOM method, except that it returns
345-
an id for removing the listener. *)
356+
useCapture boolean variant of the [addEventListener] DOM method,
357+
except that it returns an id for removing the listener. *)
346358

347359
val removeEventListener : event_listener_id -> unit
348360
(** Remove the given event listener. *)

lib/js_of_ocaml/dom_html.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -816,6 +816,8 @@ type event_listener_id = Dom.event_listener_id
816816

817817
let addEventListener = Dom.addEventListener
818818

819+
let addEventListenerWithOptions = Dom.addEventListenerWithOptions
820+
819821
let removeEventListener = Dom.removeEventListener
820822

821823
class type ['node] collection =

lib/js_of_ocaml/dom_html.mli

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2365,15 +2365,27 @@ end
23652365

23662366
type event_listener_id = Dom.event_listener_id
23672367

2368+
val addEventListenerWithOptions :
2369+
(#eventTarget t as 'a)
2370+
-> 'b Event.typ
2371+
-> ?capture:bool t
2372+
-> ?once:bool t
2373+
-> ?passive:bool t
2374+
-> ('a, 'b) event_listener
2375+
-> event_listener_id
2376+
(** Add an event listener. This function matches the
2377+
option-object variant of the [addEventListener] DOM method,
2378+
except that it returns an id for removing the listener. *)
2379+
23682380
val addEventListener :
23692381
(#eventTarget t as 'a)
23702382
-> 'b Event.typ
23712383
-> ('a, 'b) event_listener
23722384
-> bool t
23732385
-> event_listener_id
23742386
(** Add an event listener. This function matches the
2375-
[addEventListener] DOM method, except that it returns
2376-
an id for removing the listener. *)
2387+
useCapture boolean variant of the [addEventListener] DOM method,
2388+
except that it returns an id for removing the listener. *)
23772389

23782390
val removeEventListener : event_listener_id -> unit
23792391
(** Remove the given event listener. *)

0 commit comments

Comments
 (0)