javascript - 在 Haxe 中为 HTML 元素进行元素访问转换

标签 javascript haxe

如果我们想在 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

因为 ElementCanvasElement 不太具体(CanvasElement extends Element) ,您不能只将 Element 分配给 CanvasElement - 谁能说它不是 DivElement 或任何其他选项?这只能在代码执行时决定/编译器无法知道这一点,因此会出现错误( runtime vs compile time )。

在这种情况下效果很好,因为您知道 ID 为 "canv" 的元素实际上是 CanvasElement,因此您可以通过告诉编译器您知道您在使用 cast 做什么来让编译器保持沉默。当返回值实际上是其他类型时就会出错。

关于javascript - 在 Haxe 中为 HTML 元素进行元素访问转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45845189/

相关文章:

actionscript-3 - Haxe -- 像 ActionScript 一样嵌入文件?

html - 如何将 HaxeFlixel 与 openfl-bit Five 一起使用

flash - Flash 3D 引擎的比较

haxe - OpenFL 中从 PS3 Controller 输入?

javascript - 如何从外部 JavaScript 调用 Haxe 编译的 JS?

javascript - 如何以增量分辨率下载图像?

javascript - 来自服务器数据的动态路由

javascript - 提交按钮在 Bootstrap 选项卡中不起作用

javascript - 如何使用 PHP 从动态网页中抓取页面链接?

javascript - 如何用angularJs闪烁按钮