在IE中通过DOM访问帧

时间:2009-01-21 18:00:30

标签: javascript html internet-explorer iframe

好的,其他所有浏览器都可以正常使用我编码的方法,但由于某些原因Internet Explorer无法正常工作。我花了几个小时的时间(比实际开发这个功能的时间还多!)兼容性并且接近放弃了!

我有一个论坛,它的一个简洁功能是WYSIWYG编辑器。为此,我基本上有一个IFrame作为文档:

<iframe name="writer" src="/scripts/blank.html" class="writer"></iframe>

这是JavaScript的当前状态(不断更新):

function initEditor()
{
    w = frames['writer']
    wc = g('writerCopy')

    if(w == null) return

    frames['writer'].document.designMode = 'on'
    frames['writer'].document.body.innerHTML = styleSheet+wc.value
    frames['writer'].focus()
}

现在部分工作,但在线上失败了:

frames['writer'].document.body.innerHTML = styleSheet+wc.value

在Internet Explorer中,“'frames.writer.document.body'为null或不是对象”。

7 个答案:

答案 0 :(得分:1)

您是否已激活IE的debugging facilities

答案 1 :(得分:1)

我甚至不确定IE是否支持该designMode。

并且.contentDocument只有IE8,IE7和更少使用.contentWindow.document,但是iframe窗口是frame-collection的一部分。

试试这个,应该是crossbrowser:

<iframe name="writer"></iframe>

frames["writer"].document.body.innerHTML = "some html...";

答案 2 :(得分:1)

您需要将iframe指向IE的虚拟文档。只需使用以下内容创建文件blank.html

<html><body></body></html>

并设置<iframe src="blank.html" ... >

然后,您可以将frame.document.body.innerHTML = '...'引用到您的心中。

对于一个问题,BTW是一个可怕的标题。

答案 3 :(得分:1)

显然IE8在加载整个父页面之前不会使框架元素可用。另请注意,您可以在加载父页面之前写入帧,但这会覆盖帧并阻止加载。

简单的解决方案是将InitEditor()调用从正文内部移动到此处:

<body onload="InitEditor()">

答案 4 :(得分:1)

也许还没有加载iframe。我可以复制你的“'frames.writer.document.body'是null或不是对象”错误。我在它周围添加了一个setTimeout然后它为我工作。

setTimeout(function () {
    frames['writer'].document.body.innerHTML = "some text";
}, 200);

答案 5 :(得分:0)

我在这里遗漏了什么吗?不应该使用类似的东西:

window.frames[nameOrNumberOfFrame]...

另见MSDN

  

此集合仅包含窗口   对象并不提供访问权限   相应的框架和iframe   对象。要访问这些对象,请使用   文档的所有集合   包含对象。

答案 6 :(得分:0)

最后我使用了frame ['frameName']。document.write('someText'),但只有当另一个方法失败时才会使用。