如果我们想在 Canvas 上绘制一些东西,我们需要获取它的 2D 上下文。 我在项目的index.html中有一个canvas元素:
<body>
<canvas id="canv" width="200" height="200"></canvas>
</body>
现在我需要访问该元素,好吧,让我们编写代码:
var cans:CanvasElement = Browser.document.getElementById("canv");
在编译阶段我收到错误:
src/Main.hx:32: characters 2-78 : js.html.Element should be 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)';
是的,我知道,“如果它有效 - 不要修复”,我大致明白一切都很正常,原则上我在 Actor 时得到了我需要的东西,但有人能为我解释这个过程吗? 这是什么意思 - js.html.Element 应该是 js.html.CanvasElement?我刚刚开始 Haxe 学习(尤其是编程),我很高兴,我可以做可行的事情,但我想知道,为什么它在有效时有效,为什么在无效时无效。
最佳答案
js.html.Element should be js.html.CanvasElement
这仅仅意味着编译器期望类型为CanvasElement
(因为这是cans
变量的类型提示告诉它的),但是遇到了其他东西(在本例中为 Element
)。您正在尝试分配 getElementById()
返回的值到 cans
,但 getElementById()
返回一个 Element
。
因为 Element
比 CanvasElement
不太具体(CanvasElement
extends Element
) ,您不能只将 Element
分配给 CanvasElement
- 谁能说它不是 DivElement
或任何其他选项?这只能在代码执行时决定/编译器无法知道这一点,因此会出现错误( runtime vs compile time )。
在这种情况下效果很好,因为您知道 ID 为 "canv"
的元素实际上是 CanvasElement
,因此您可以通过告诉编译器您知道您在使用 cast
做什么来让编译器保持沉默。当返回值实际上是其他类型时就会出错。
关于javascript - 在 Haxe 中为 HTML 元素进行元素访问转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45845189/