【问题标题】:How does one have access to frame's document object from another frame?如何从另一个框架访问框架的文档对象?
【发布时间】:2013-06-12 20:01:50
【问题描述】:

好的,我有一个包含框架集的页面。其中一个框架包含一个 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" 已成功添加到 frame2。

非常感谢!

【问题讨论】:

    标签: javascript jquery html dom frames


    【解决方案1】:

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

    无论如何,不​​需要使用 jQuery,这要简单得多:frameset 窗口你引用 总是 top,所有框架窗口你可以用 top.frame_name (@987654326 @ 不需要),无论您想在哪里引用它们。当您需要一个文档时,它就在window 对象的正下方。在您的情况下:top.frame1.documenttop.document

    还要注意,fooframeset 的名称,而不是任何框架。因此$('frame[name="foo"]', window.parent.document).attr("id", "foo"); 没有按照您的预期进行。 (或者可能只是帖子中的错字?)

    这应该可以完成这项工作,尽管top 可能在frame2 中的body 存在之前很长时间才准备好。

    $(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);
        }
    });
    

    【讨论】:

    • @OlivierBlanchard 怎么了?首先,您接受了答案,然后拒绝了它。如果您还有其他问题,请发表评论。
    • 对不起,Teemu 取笑了你,我错误地选择了你的帖子作为选择的答案。尽管如此,我也想感谢您抽出时间来回答我的问题。正如我在问题中所说,id“foo”已成功添加到 frame2。选择器的语法应该没问题,因为我在所有框架中选择了名称为“foo”的框架,并且上下文是框架中包含的页面的父文档。在更正了代码中的几个错误之后,它也起作用了。我将您的答案重新标记为已接受的唯一原因是因为它很优雅。
    • @OlivierBlanchard LOL... 没有错误,使用comma 链接变量声明是完全有效的JS。实际上它是解释器的done anyway,一些 JS 指南甚至推荐它作为编写函数的唯一有效方式。
    猜你喜欢
    • 2013-02-03
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多