Javascript Scala.js:使用addEventListener向对象添加事件

Javascript Scala.js:使用addEventListener向对象添加事件,javascript,addeventlistener,scala.js,Javascript,Addeventlistener,Scala.js,在JavaScript中,addEventListener()方法的使用方式如下: object.addEventListener("click", myScript); canvas.addEventListener("click", { (e0: dom.Event) => val e = e0.asInstanceOf[dom.MouseEvent] ... }, false) 在Scala.js中:我有一个画布,我只想听到画布上的点击,而不是整个文档。在Scala.js

在JavaScript中,addEventListener()方法的使用方式如下:

object.addEventListener("click", myScript);
canvas.addEventListener("click", { (e0: dom.Event) =>
  val e = e0.asInstanceOf[dom.MouseEvent]
  ...
}, false)
在Scala.js中:我有一个画布,我只想听到画布上的点击,而不是整个文档。在Scala.js.dom库中,addEventListener定义为:

 def addEventListener(`type`: String, listener: js.Function1[Event, _], useCapture: Boolean = ???): Unit = ???
我不确定“useCapture”指的是什么。但我试过:

dom.document.getElementById("canvas").addEventListener("click", {
(e:dom.MouseEvent) => { /*do something*/ }
}, false)
我得到的错误信息是:

found   : org.scalajs.dom.MouseEvent => Unit
required: scala.scalajs.js.Function1[org.scalajs.dom.Event, _]
有人能解释一下“useCapture”指的是什么,以及如何在Scala.js中正确使用addEventListener吗

事件捕获是EventListener在上注册的过程 事件目标的祖先可以拦截给定类型的事件 在事件目标收到它们之前。捕获操作从 树的顶部,通常是文档,向下,使其成为 与下面描述的鼓泡对称相反。锁链 从树顶部到事件目标的EventTargets的 在事件初始分派之前确定。如果修改 在事件处理期间发生在树上,事件流将继续 基于树的初始状态

订单将是

内容2(首先定义,使用capture=true)

某物1(使用capture=true第二次定义)

注意第二个参考:订单不保证

捕获阶段

一个事件在被目标节点处理之前可以由一个目标祖先处理的过程


您得到的错误消息是一个完全正常的类型错误:
addEventListener
需要一个
js.Function1[dom.Event,
,但您给它一个
js.Function1[dom.MouseEvent,
。由于第一个参数处于逆变位置,因此不会进行类型检查

有两种解决方案:要么让函数接受
dom.Event
,然后将其强制转换为
dom.MouseEvent
,如下所示:

object.addEventListener("click", myScript);
canvas.addEventListener("click", { (e0: dom.Event) =>
  val e = e0.asInstanceOf[dom.MouseEvent]
  ...
}, false)
或者您可以使用更精确键入的
onclick

canvas.onclick = { (e: dom.MouseEvent) =>
  ...
}

关于
useCapture
,下面的代码片段来自:“指示此类型的事件将被分派到注册的侦听器,然后再分派到DOM树中它下面的任何EventTarget。”是否有
+=
操作符(或类似操作符),例如
canvas.onclick+={(e:DOM.MouseEvent)=>…}
@David Portarella:不,至少不在默认的scalajs dom外观中。也许有一个图书馆提供类似的东西。