在Haxe中为HTML元素转换元素访问

Gre*_*fer 2 javascript haxe

如果我们想在画布上绘制一些东西,我们需要获得它的2D上下文.我在项目的index.html中有一个canvas元素:

 <body>
    <canvas id="canv" width="200" height="200"></canvas>
 </body>
Run Code Online (Sandbox Code Playgroud)

所以现在我需要访问该元素,好吧,让我们编写代码:

var cans:CanvasElement = Browser.document.getElementById("canv");
Run Code Online (Sandbox Code Playgroud)

在编译阶段我得到错误:

src/Main.hx:32:字符2-78:js.html.Element应该是js.html.CanvasElement

但是,如果我们使用不安全的铸造,已经很好了:

var cans:CanvasElement = cast Browser.document.getElementById("canv");
Run Code Online (Sandbox Code Playgroud)

一切正常,我可以访问并获得2D上下文或进行一些设置,如:

cans.width = cans.height = 800;
cans.style.backgroundColor = 'rgba(158, 167, 184, 0.4)';
Run Code Online (Sandbox Code Playgroud)

是的,我知道,"如果它有效 - 不要修复",我粗略地理解一切都是正常的,原则上我得到了我需要的东西,当得到演员,但是有人可以为我解释这个过程吗?这是什么意思 - js.html.Element应该是js.html.CanvasElement?我只是开始学习Haxe(特别是编程),我很高兴,我可以做可行的事情,但我想知道,为什么它在工作时起作用,为什么不起作用.

Gam*_*a11 5

js.html.Element应该是js.html.CanvasElement

这只意味着编译器期望类型CanvasElement(因为这是cans变量的类型提示告诉它),但遇到其他东西(Element在这种情况下).您正在尝试分配getElementById()to 返回的值cans,但getElementById()返回一个Element.

既然Element那么具体CanvasElement(CanvasElement扩展Element),你不能只分配Element给一个CanvasElement-谁又能说这不是一个DivElement,或任何其他的选择吗?这只能在代码执行/编译器无法知道时才能确定,因此错误(运行时与编译时).

因为你知道,与ID的元素这个工作在这种情况下,罚款"canv" 实际上是一个CanvasElement,这样你就可以告诉它你知道你有做沉默的编译器cast.当返回的值实际上具有另一种类型时,它将出错.