2010-05-18 69 views
1

(对不起,如果这不是合适的论坛发布 - 我找不到任何与非本地编程相关的任何内容并与此主题相关)问题 - 在Windows Mobile 6.1上使用Javascript设置动态HTML到iFrames - IE Mobile6

我正在尝试将动态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的容器元素这是为它设置的。

我一直在使用它,直到现在,当我观察到由于onClicks或其他JS方法附加到动态HTML中的锚点和图像,div上的设置innerHTML需要花费更多的时间。出现JS方法或HTML是一些如何没有得到正确清理

也正在讨论(内存泄漏?) - http://www.experts-exchange.com/Programming/Languages/Scripting/JavaScript/Q_26185526.html#a32779090

回答

0

好的,我有点解决了我以前面临的问题,以及将HTML设置为IEMobile上的iFrame的更大问题。但我仍然有一个与双蜗牛有关的PI​​A - 我目前正在研究。似乎还有更多可怜的灵魂面临类似的问题 - 如果我也修复这个问题。我会在这里发布更新。

我是如何最终写入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; 

我怎么设法通过HTML在父母和孩子之间iFrame 早些时候由@bobince解释过,人们必须依靠第三方服务(如Cookie或服务器)来传递父级和子级iFrame之间的数据。

我实际上使用一个ActiveXControl来分别设置和获取来自父和子iFrame的javascript数据。如果你必须为此引入一个ActiveX控件,我不会推荐这样做。我不小心已经有一个我用来获取动态HTML的第一个地方。

如果您需要任何帮助,您可以马克我 - Twitter的@Swaroop

感谢@bobince您的帮助。我将这个标记为答案,因为它说明了我是如何解决这个问题的。

0

我已经尝试了几件事情,但他们都不工作。

欢迎来到IEMobile!没有关于DOM脚本的知识适用于此处。

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

  • frameelement.contentDocument(标准DOM方法)不可用
  • frameelement.contentWindow.document(在IE6-7解决方法的版本)不可用
  • 老派的Netscape window.frames阵列仅适用于帧,I帧不
  • 让子文档将其document对象传递给window.parent仅适用于框架,而不适用于iframe。在iframe,window.parent===window

所以,唯一的办法前进,我可以看到的是:

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

出现的JS方法或HTML是一些如何没有得到清理正确(内存泄漏?)

是的,可能。在动态HTML中,IEMobile6-7(*)几乎不可用。它给了你一个可爱的风格,它对于我们在Netscape 4天内糟糕的回馈有着怎样的脚本。

尽量避免创建和销毁大量节点和事件处理程序。尽可能保持页面为静态,尽可能重复使用元素节点并设置文本节点数据属性,以便将所有内容全部删除并重新制作createElementinnerHTML。如果您需要从JavaScript设置事件处理程序,则首先在HTML中使用事件存根(onclick="return this._onclick()"),然后再写入_onclick,而不是使用新的事件处理程序重新创建HTML(或仅尝试设置属性,在IEMobile工作)。尽可能避免长时间运行单个页面。

它仍会崩溃,但希望它会花费更长的时间。

*:也就是说,版本6.1.4之前的WinMo版本,它成为无限更好的IEMobile8,作为“Internet Explorer Mobile 6”(谢谢微软)销售。

+0

你能解释一下这个 “使用事件存根(的onclick =”返回this._onclick()“)在HTML写作一起_onclick如果你需要设置从JavaScript事件处理程序,优先于重新创建HTML与一个新的事件处理程序(或只是试图设置该属性,这当然不适用于IEMobile)。“ 我完全不知道你要求我改变什么。我通常使用onClick属性定位标签或图片。我也有像文本框和文本区等输入元素onChange() – Swaroop 2010-05-19 11:56:57

+0

我在说的是,你不能从IEMobile,即''document.getElementById('x' ).onclick = somefunction'。您可以附加到'click'事件的唯一方法是使用HTML中的实际内联事件处理程序,如''。这通常是可怕的做法,要避免,并且这意味着您不能在不重新创建HTML(并因此泄漏内存)的情况下更改事件处理程序。使用一个存根'onclick'属性可以避免这个问题,这个''onclick'属性只是转发到一个'_onclick'属性,你可以从JavaScript写入。 – bobince 2010-05-19 13:48:22

+0

我现在了解存根实施。但是我每次都会替换整个HTML(动态),而不仅仅是onClick()属性。 我喜欢这个想法,尽管使用存根,我们可以通过清除JS实现使用的内存来清除存根实现,就像断开指针一样。 但我坚持在同一页面上使用动态HTML的主要原因之一是为了避免每次都重新加载Javascript。我有一次加载JS实现,动态HTML多次使用它。 – Swaroop 2010-05-20 09:29:59

相关问题