【问题标题】:Input elemnts in HTMLLoader are readonly in adobe AIRHTML Loader 中的输入元素在 adobe AIR 中是只读的
【发布时间】:2026-02-15 18:15:02
【问题描述】:

假设我有一个包含表单的 html 文件:

<form method="post" action="url">
    <input type="text" id="fullname" />
    <input type="text" id="bodyText" />
    <input type="submit">
</form>

我们已经在一个 swf 文件中使用 HTMLLoader 加载了这个 html 文件。

_htmlLoader = new HTMLLoader();
_htmlLoader.paintsDefaultBackground = false;
var req:URLRequest = new URLRequest(urlValue);
_htmlLoader.load(req);
_stage.addChild(_htmlLoader);

在主应用程序中使用Loader 加载此Swf 文件后,文本框是只读的,无法输入。 但是我们可以使用鼠标改变它们的焦点。

var loader1:Loader = new Loader();
loader1.load(new URLRequest("path to file.swf"));
// ...
this.addChild(loader1);
// ...

有什么问题?

【问题讨论】:

  • 如果您直接查看第一个 SWF(具有 HTMLLoader 的那个)(作为 AIR 应用程序的主 SWF)而不将其加载到另一个 SWF 中,那么 HTML 表单元素是否可以正常工作(即接受键盘输入) ?如果是这样,那么您提到的问题看起来像是 AIR 中的错​​误。
  • 您的应用程序是否以全屏模式运行?

标签: html actionscript-3 air loader


【解决方案1】:

在触发Event.COMPLETE 事件后是否附加了 HTMLLoader?甚至可能值得等待 HTMLLoader 的文档触发 DOMReady 事件,然后再将其附加到舞台。

试试这样的:

_htmlLoader = new HTMLLoader();
_htmlLoader.paintsDefaultBackground = false;
var urlRequest:URLRequest = new URLRequest(urlRequest);
_htmlLoader.addEventListener(Event.COMPLETE, completeHandler);
_htmlLoader.load(urlRequest);

function completeHandler(event:Event):void { _htmlLoader.window.document.addEventListener("DOMContentLoaded", readyHandler); }

function readyHandler(event:Event):void { _stage.addChild(_htmlLoader); }

Flex documentation about handling HTML events 提到了这一点:

当侦听器引用特定的 DOM 元素时,这是一种很好的做法 等待父 HTMLLoader 调度完成事件 在添加事件侦听器之前。 HTML 页面经常加载多个 文件和 HTML DOM 没有完全构建,直到所有文件 加载和解析。 HTMLLoader 调度完成事件时 所有元素都已创建。

HTMLLoader 可能在文档实际准备好之前就被附加到了这个阶段,这可能解释了一些奇怪之处。

如果您有任何更多的信息,这将是一个很棒的帮助......

【讨论】:

    【解决方案2】:

    建议的解决方案(“在addChild 之前等待DOMContentLoaded 事件”)对我不起作用。

    相反,它使用FULL_SCREEN_INTERACTIVE 显示状态工作。 根据Adobe's documentation about FULL_SCREEN

    “已为移动设备启用键盘交互”

    (我猜是它禁用了其他配置文件,例如桌面)。

    FULL_SCREEN_INTERACTIVE

    指定舞台处于全屏模式启用键盘交互。从 Flash Player 11.3 开始,AIR 应用程序和基于浏览器的应用程序都支持此功能。

    所以在我的情况下,解决方案是:

    _stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE
    

    【讨论】: