javascript 如何弹出一个虚拟键盘,使用户能够填写在Chrome上的iframe中运行的外部页面的字段

igetnqfo  于 2022-12-10  发布在  Java
关注(0)|答案(1)|浏览(111)

我有一个运行在Ubuntu Chrome上的web应用。我的屏幕是触摸屏,没有键盘供用户使用。我在每个需要输入的屏幕上都使用自己的JavaScript键盘。现在,我需要在我的应用中嵌入一个外部表单,它位于iFrame中。我对这个页面内容没有控制权。
我的问题是如何为我的用户提供键盘来填充此iFrame字段?
我探索了两个选项:
1.触发键盘事件-失败,因为已弃用,主要原因是存在安全问题
1.显示chrome的虚拟键盘-无法找到一种方法来控制它何时弹出,因为我不希望它出现在我自己的页面中。
有人能帮忙吗?

relj7zay

relj7zay1#

对于像我这样多年后发现这一点的人来说:
实际上,这个问题没有完整的答案,因为有几个问题。
实际上,你可以在iFrame的文档中添加focus/focusinblur/focusout的事件监听器。它可以工作,但是有很多页面包含用于登录等的嵌套iFrame。如果你现在也尝试在它们的文档中添加监听器,CORS会阻止它。
这实际上是一件好事,因为我们还可以监听按键事件并获得密码等。
现在,即使您停用了CORS(当然您不应该),您仍然需要一个MutationObserver,因为许多页面会改变DOM来显示输入和其他内容。节点也必须 “扫描” 输入和iFrame,以及iFrame的文档。
所以你会看到这将是一个巨大的递归混乱,这可能对性能也很不利。不要忘记随之而来的漏洞。
这就是为什么大多数虚拟键盘扩展,例如Chrome,只是不工作的说,iFrame。
如果你想像他们那样做,你基本上只需要为键盘相关的输入类型定义一个白名单,选择iFrame并执行以下操作:

iFrame.contentWindow.addEventListener('focus', (e) => {
  if ((e.target instanceof HTMLInputElement &&
  WHITE_LIST.includes(e.target.type))
  || e.target instanceof HTMLTextAreaElement)) {
    //summon keyboard
  }
}, true);

对于“blur”(键盘关闭),甚至不需要条件。

相关问题