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

use*_*403 7 javascript addeventlistener scala.js

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

object.addEventListener("click", myScript);
Run Code Online (Sandbox Code Playgroud)

在Scala.js中:我有一个画布,我想只听画布上的点击,而不是整个文档.在Scala.js.dom库中,addEventListener定义为:

 def addEventListener(`type`: String, listener: js.Function1[Event, _], useCapture: Boolean = ???): Unit = ???
Run Code Online (Sandbox Code Playgroud)

我不确定"useCapture"是指什么.但我试过:

dom.document.getElementById("canvas").addEventListener("click", {
(e:dom.MouseEvent) => { /*do something*/ }
}, false)
Run Code Online (Sandbox Code Playgroud)

我得到的错误信息:

found   : org.scalajs.dom.MouseEvent => Unit
required: scala.scalajs.js.Function1[org.scalajs.dom.Event, _]
Run Code Online (Sandbox Code Playgroud)

有人可以解释"useCapture"引用的内容,以及如何在Scala.js中正确使用addEventListener吗?

sjr*_*jrd 8

你得到的错误信息是一个完全正常的类型错误:addEventListener期望a js.Function1[dom.Event, _],但你给它一个js.Function1[dom.MouseEvent, _].由于第一个参数处于逆变位置,因此不会进行类型检查.

有两种解决方案:要么你让你的函数采取a dom.Event,然后你投射到dom.MouseEvent,像这样:

canvas.addEventListener("click", { (e0: dom.Event) =>
  val e = e0.asInstanceOf[dom.MouseEvent]
  ...
}, false)
Run Code Online (Sandbox Code Playgroud)

或者您使用onclick哪种更精确的类型:

canvas.onclick = { (e: dom.MouseEvent) =>
  ...
}
Run Code Online (Sandbox Code Playgroud)