1

(如果这不是发帖的正确论坛,请原谅我 - 我找不到与非本地编程相关的任何内容以及与该主题相关的任何内容)

我正在尝试将动态 HTML 设置为网页上的 iFrame。我尝试了几件事,但似乎都没有工作。我能够阅读 innerHTML 但似乎无法更新它。

// Able to read using 
document.getElementById('iFrameIdentifier').innerHTML;

// On Desktop IE, this code works 
document.getElementById('iFrameId').contentWindow.document.open();
document.getElementById('iFrameId').contentWindow.document.write(dynamicHTML);
document.getElementById('iFrameId').contentWindow.document.close();

理想情况下,相同的功能应该与 div 的工作方式相同,但它说“对象不支持此方法或属性”。

我也尝试过 document.getElementById('iFrameId').document.body.innerHTML。

这显然替换了页面的整个 HTML 而不仅仅是 innerHTML。

我已经尝试了几件事,但它们没有用

  • document.getElementById('iFrameId').body.innerHTML
  • document.frames[0].document.body.innerHTML

我的目的是拥有一个容器元素,该元素可以包含为其设置的动态 HTML。

到目前为止,我一直很好地使用它,因为我观察到在 div 上设置 innerHTML 正在花费越来越多的时间,因为 onClicks 或其他 JS 方法附加到动态 HTML 中的锚点和图像。似乎 JS 方法或 HTML 无法正确清理(内存泄漏?)

也在讨论中 - http://www.experts-exchange.com/Programming/Languages/Scripting/JavaScript/Q_26185526.html#a32779090

4

2 回答 2

0

好的,我有点解决了我之前面临的问题以及更大的问题,即在 IEMobile 上将 HTML 设置为 iFrame。但我还有一个与双斜杠有关的 PIA——我目前正在研究。似乎有更多可怜的灵魂面临着类似的问题——如果我也解决这个问题的话。我会在这里发布更新。

我最终是如何在 IEMobile 上写入 iFrame 的? 有 2 个 div,一个用于包装 iFrame,另一个用于写入 iFrame。

document.getElementById('OuterDiv').innerHTML = '';
document.getElementById('OuterDiv').innerHTML = '<iframe id="iFrameId" src="somefile.html"></iframe>';

这每次都会创建一个 iFrame,并且在加载的 somefile.html 中有一个 InnerDiv.innerHTML 似乎不会泄漏内存。

在 somefile.html 中将有一个 onLoad 方法,它将获取 HTML(下面解释了我如何设法获取它)并执行

document.getElementById('InnerDiv').innerHTML = dynamicHTML;

我是如何设法在父 iFrame 和子 iFrame 之间传递 HTML 正如@bobince 之前解释的那样,必须依靠 cookie 或服务器等第三方服务在父 iFrame 和子 iFrame 之间传递数据。

事实上,我使用 ActiveXControl 分别从父 iFrame 和子 iFrame 的 javascript 中设置和获取数据。如果您必须为此引入 ActiveX 控件,我不建议您这样做。我不小心已经有一个我用来首先获取动态 HTML 的。

如果您需要任何帮助,可以私信我 - Twitter @Swaroop

感谢@bobince 的帮助。我将此标记为答案,因为它说明了我为解决该问题所做的工作。

于 2010-05-20T13:05:23.713 回答
0

我尝试了几件事,但似乎都没有工作。

欢迎来到 IEMobile!你所知道的关于 DOM 脚本的一切都不适用这里。

不幸的是,跨 iframe 脚本在 IEMobile6-7 中似乎是不可能的。

  • frameelement.contentDocument(标准 DOM 方法)不可用
  • frameelement.contentWindow.document(IE6-7 解决方法版本)不可用
  • 老式的 Netscapewindow.frames数组仅适用于帧,不适用于 iframe
  • 让子文档将其document对象传递window.parent给框架的唯一作品,而不是 iframe。在一个iframewindow.parent===window

所以我能看到的唯一前进方法是:

  1. 使用框架而不是 iframe。讨厌。或者,
  2. 用于document.cookie在父子之间进行通信:子文档只是一个脚本,它在document.cookie轮询器中检查特定的 cookie,当发现这是来自父级的消息时,它可以编写一些 HTML 或其他内容。缓慢而讨厌。或者,
  3. 使用服务器端将内容注入框架,将其作为参数传递给脚本。缓慢,讨厌,并且可能不安全。或者,
  4. 完全避免框架(最好,如果可以的话)。或者,
  5. 放弃对 IEMobile6-7 的支持(如果你能侥幸逃脱的话,最好是保持理智!)

似乎 JS 方法或 HTML 无法正确清理(内存泄漏?)

很可能是。IEMobile6-7(*) 在动态 HTML 中几乎无法使用。它为您提供了在 Netscape 4 天里,我们这些可怜的 git 脚本曾经是什么样子的可爱味道。

尽量避免创建和销毁大量节点和事件处理程序。尽可能保持页面静态,尽可能重用元素节点并设置文本节点数据属性,而不是删除所有内容并使用createElementor重新创建innerHTML。如果需要从 JavaScript 设置事件处理程序,请在 HTML 中使用事件存根 ( onclick="return this._onclick()") 并写入 to _onclick,而不是使用新的事件处理程序重新创建 HTML(或者只是尝试设置属性,这当然不起作用在 IEMobile 中)。尽可能避免长时间运行的单页。

它仍然会崩溃,但希望它需要更长的时间。

*:即 WinMo 上 6.1.4 之前的 IE 版本,在那里它变成了无限更好的 IEMobile8,被称为“Internet Explorer Mobile 6”(谢谢微软)。

于 2010-05-18T10:07:30.147 回答