作者:大姑娘不再回_402 | 来源:互联网 | 2023-01-21 17:47
如果我们想在画布上绘制一些东西,我们需要获得它的2D上下文.我在项目的index.html中有一个canvas元素:
所以现在我需要访问该元素,好吧,让我们编写代码:
var cans:CanvasElement = Browser.document.getElementById("canv");
在编译阶段我得到错误:
src/Main.hx:32:字符2-78:js.html.Element应该是js.html.CanvasElement
但是,如果我们使用不安全的铸造,已经很好了:
var cans:CanvasElement = cast Browser.document.getElementById("canv");
一切正常,我可以访问并获得2D上下文或进行一些设置,如:
cans.width = cans.height = 800;
cans.style.backgroundColor = 'rgba(158, 167, 184, 0.4)';
是的,我知道,"如果它有效 - 不要修复",我粗略地理解一切都是正常的,原则上我得到了我需要的东西,当得到演员,但是有人可以为我解释这个过程吗?这是什么意思 - js.html.Element应该是js.html.CanvasElement?我只是开始学习Haxe(特别是编程),我很高兴,我可以做可行的事情,但我想知道,为什么它在工作时起作用,为什么不起作用.
1> Gama11..:
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
.当返回的值实际上具有另一种类型时,它将出错.