如何从另一个框架访问框架的文档对象?

时间:2013-06-12 20:01:51

标签: javascript jquery html dom frames

好吧我有一个包含框架集的页面。其中一个框架包含一个asp页面,其中包含用javascript编写的脚本。 此脚本需要能够访问包含在另一个框架内(在框架集中)的asp页面的内容。以下是框架集代码的示例:

<frameset name="foo">
    <frame name="frame1" src="mydomain/path/of/the/page.asp">
    <frame name="frame2" src="mydomain/path/of/the/other/page.asp">

所以基本上 frame1中包含的页面内的脚本试图访问frame2中包含的页面内的内容(更具体地说是尝试插入DOM元素)。

两个框架都在同一个域(和子域)上,因此跨脚本编写不应成为问题。我无法编辑脚本之外的代码,因此我不得不使用框架。这是我目前的代码:

//Ideally, I would like to make sure the page contained within frame2 is loaded before trying to access it's elements. I still need to figure that one out. 
$(document, window.parent).ready( function () {    
    //Assign id "foo" to frame2 using jQuery
    $('frame[name="foo"]', window.parent.document).attr("id", "foo"); 
    var doc;
    var testNode;
    var frmObj = window.parent.document.getElementById('foo'); 
    if (frmObj.contentDocument) { // DOM
        doc = frmObj.contentDocument;
    } 
    else if (frmObj.contentWindow) { // IE 
        doc = frmObj.contentWindow.document;
    }
    if (doc) {
        testNode = doc.createElement('div');
        testNode.Id = "testNode";
        doc.getElementByTagName('body').appendChild(testNode);
    }
});  

包含getElementByTagName的行在IE 10中引发错误:

  

SCRIPT438:对象不支持属性或方法'getElementByTagName'

似乎文档对象没有任何名为getElementByTagName的方法。在这种情况下,可以说文档对象不存在,这是荒谬的,因为我在尝试调用它的方法之前测试了它的存在。了解这一切,我们如何解决这个问题?

注意:

  • 我无法使用其他浏览器测试该问题,因为所有页面所需的外部代码都使用vbscript。
  • id“foo”已成功添加到第2帧。

非常感谢!

1 个答案:

答案 0 :(得分:2)

HTML5不支持框架,如果您有正确的文档类型声明,则会看到空白页。

无论如何,不​​需要使用jQuery,这要简单得多:到frameset窗口,你引用始终top,你可以用{{{{{{{ 1}}(不需要top.frame_name),无论你想在哪里引用它们。当您需要文档时,它就在id对象下面。在您的情况下:windowtop.frame1.document

另请注意,top.documentfoo的名称,而不是任何框架。因此frameset没有按照您的期望行事。 (或者也许只是帖子中的拼写错误?)

这应该可以完成这项工作,但在$('frame[name="foo"]', window.parent.document).attr("id", "foo"); top存在body之前,frame2可能已经准备好了很长时间。

$(document, top).ready(function () {    
    var testNode,
        frmObj = top.frame2,
        doc = frmObj.document;
    if (doc) {
        testNode = doc.createElement('div');
        testNode.id = 'testNode';
        doc.body.appendChild(testNode);
    }
});