如何在IE7中获取Object元素的contentWindow

时间:2010-05-12 05:43:32

标签: javascript html internet-explorer

我有一个像这样的HTML对象元素:
<object title="Search results as XML" standby="Loading XML document..." type="text/xml" data="/__CA25761100195585.nsf/WebPrintListingXML?OpenAgent&date1=01/06/2009" width="100%" height="100%" border="0" name="resultIFrame" id="resultIFrame"> Error: could not embed search results. </object>

我也有这个javascript函数(为调试添加了alert()调用):

function getFrameByName(fParent,fName)
{
    var fArray=fParent.frames;
    if (!fName) return;
    if (fArray) {
        if (fArray.length) {
            for (var i=0; i<fArray.length; i++) {
                alert('loop '+i);
                if (fArray[i]) {
                    if (fArray[i].name==fName) return fArray[i];
                }
            }
        }
    }
    var tmp=document.getElementsByName(fName);
    if (tmp[0]) {
        alert('returning '+tmp[0]);
        if (!(tmp[0].contentWindow)) alert('contentWindow is null');
        return tmp[0].contentWindow;
    }
}

最后,此按钮用于打印Object元素的内容:
<input type="button" value="Print" name="printBtn" onclick="getFrameByName(window,'resultIFrame').print();">

该按钮在Firefox中完美运行。 Opera虽然打印主文档而不仅仅是对象,但已经足够好了。 IE7给出以下错误详情:
    行:57     Char:1     错误:'undefined'为null或不是对象

第57行是HTML源代码中按钮的“input”标签的开头位置。 感谢JS函数中的alert('contentWindow is null')调用,我知道我在IE中获得的对象没有contentWindow属性。

我尝试将object代码更改为iframe代码。这会更改JS行为,但会导致忽略height属性等其他问题,并且内容不会显示 坚持使用object标签,如何在IE7中获取此对象的窗口?

2 个答案:

答案 0 :(得分:2)

如果您知道iframe的名称,获取其窗口对象的最简单方法是调用window.frames [frameName]。这将返回对窗口对象的引用,而不是iframe

答案 1 :(得分:0)

我知道这个问题已经过时了,但这里有一些我的发现:

使用window.frames[frameName]的方法在firefox和chrome中运行良好,但在IE中包含了许多奇怪的怪癖。 在ff和chrome中,您可以通过window.frames[frameName].document访问文档元素,您只需要将name属性添加到对象标记。

但在IE中(我的情况是8)你需要拨打contentDocument而不是document。没关系,但是这里有一些非常奇怪的东西,如果有另一个完全无关的对象,其ID等于对象标签的名称,IE会混淆并返回一个html集合,同时包含ID元素和命名对象。然后,您需要从列表中过滤掉对象,以使用如下索引访问contentDocument属性:window.frames[frameName][1].contentDocument

您可以使用jquery获取文档的内容:$(window.frames[frameName].document).contents().find("selector");

哇,到目前为止,这就是我所拥有的一切。我认为最好的方法是检查'frame'是否包含IE的属性'contentDocument',而其他人则访问正常的'document'属性。