我正在尝试使用scalajs,并对使用org.scalajs.dom.html包访问DOM元素感到困惑。
通过反复试验,我发现某些元素需要使用asInstanceOf
转换为某些类型,但有些则不需要。关于何时何地需要使用asInstanceOf
,是否有一般规则?
例如,假设我有一个标识为input
的{{1}}元素。为了访问输入的值,我需要使用myinput
:
asInstanceOf
但是当我的val content = document.getElementById("myinput").asInstanceOf[html.Input].value
身份content
中显示div
时,编译器在我没有使用contentdiv
时没有抱怨asInstanceOf
元素:
div
另外,作为奖励,有一个中心位置可以找到所有可能的val mydiv = document.getElementById("contentdiv")
mydiv.innerHTML = content
参数以及它们与实际HTML元素的映射吗?
答案 0 :(得分:3)
getElementById
的签名是
def getElementById(id: String): DOMElement
和DOMElement
定义为
trait DOMElement extends js.Object {
var innerHTML: String = js.native
def appendChild(child: DOMElement): Unit = js.native
}
因此,每当您致电getElementById
时,您都会获得DOMElement
,而您可以执行的唯一操作是innerHTML
和appendChild
。
这就是为什么你的最后一个例子没有明确的强制转换的原因。
但是DOMElement
是一种非常通用的类型。有时您知道 getElementById
会返回 - 比如说 - <input>
元素。
当你可以使用asInstanceOf
通知编译器你有这方面的额外知识时。
document.getElementById("myinput").asInstanceOf[html.Input].value
^
|
hey compiler, I KNOW this is going to be an html.Input,
please let me do my things and explode otherwise.
毋庸置疑,使用asInstanceOf
时需要小心。如果你错了,这次编译器就不能让你免于运行时崩溃。
答案 1 :(得分:1)