【问题标题】:Dynamically created editable iframe not working in Firefox动态创建的可编辑 iframe 在 Firefox 中不起作用
【发布时间】:2019-03-13 18:06:42
【问题描述】:

我有一个在 JavaScript 中使用createElement() 在触发函数时生成的 iframe,它变成了一个文本编辑器。它在 Chrome、Safari 和 Edge 中运行良好,但在 Firefox 中,innerHTML 文本“文本层”将在 iframe 内短暂闪烁,然后消失,并且 iframe 似乎不可编辑。经检查,iframe 的 body 标记为空。如果我在检查器中将 iframe 的 body 标记上的 contentEditable 设置为 true,它似乎可以正常工作,但是当我尝试在我的 JS 函数中设置它时,Firefox 中什么也没有发生。

我猜这与在 JavaScript 中创建的 iframe 有关,因为使用 JS 将 DOM 中已经存在的 iframe 的 designMode 设置为 'On' 似乎可以正常工作。想知道是否有办法让它在 Firefox 中工作,也许是另一种创建 iframe 的方法?我已经看到了一些类似的问题,这些问题通过在 iframe 的src 中放入一些 javascript 来解决,就像在 cmets here 中一样,但这显然会导致其他浏览器出现问题。在 JS 中创建 iframe 比从某个地方附加它更可取。

function text() {
var rtf = document.createElement("iframe");
rtf.name = "richTextField";
rtf.id = "richTextField";
rtf.className = "texteditor";
var dwrap = document.createElement("div");
dwrap.appendChild(rtf);
var tframe = document.getElementById("richTextField");
tframe.contentWindow.document.designMode = 'On';
tframe.contentWindow.document.body.innerHTML = "Text Layer";
tframe.contentWindow.document.getElementsByTagName('body')[0].focus();
tframe.onload = autosize();
};

【问题讨论】:

  • 看起来像是错误或安全功能..您是否尝试在 Mozilla 错误跟踪器中查找类似问题?
  • 我在contentWindow 上设置内容时发现了同样的问题,尽管是在 15 年前:link 看起来我应该尝试在@987654332 中设置designMode @ 功能。将使用结果更新帖子。

标签: javascript html firefox iframe createelement


【解决方案1】:

找到了这个15 year old bug report,并且能够通过在 setTimeout 函数中设置 contentWindow 属性来使其工作。

function text() {
var rtf = document.createElement("iframe");
rtf.name = "richTextField";
rtf.id = "richTextField";
rtf.className = "texteditor";
var dwrap = document.createElement("div");
dwrap.appendChild(rtf);
var tframe = document.getElementById("richTextField");

setTimeout(function(){ 
tframe.contentWindow.document.designMode = 'On';
tframe.contentWindow.document.body.innerHTML = "Text Layer";
tframe.contentWindow.document.getElementsByTagName('body')[0].focus();
}, 0);

tframe.onload = autosize();
};

【讨论】:

  • 谢谢,这让我上墙了,一切都在 DOMContentLoaded 之后触发,但仍然无法插入内容,我意识到在设置 innerHTML 之前放置一个警告框就足够了延迟正常工作,虽然弹出框并不理想。我猜这个超时技巧实际上是因为它需要与 alert() 相同的脚本中断才能工作。非常疯狂,但谢谢!
猜你喜欢
  • 2015-05-28
  • 2012-11-27
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2014-11-21
  • 2019-01-09
  • 1970-01-01
相关资源
最近更新 更多