当框架集嵌套在iframe

时间:2016-03-01 18:16:03

标签: javascript silverlight iframe visio frames

我试图在嵌套在parent.parent中的<frameset>的上下文中理解<iframe>对象。它的行为似乎与嵌套在<frameset>中的window不同。如果您将<frameset>页面放入<iframe>,我希望parent.parent能够引用<iframe>的窗口 - 但这似乎不正确?

Parent Doc  <== parent.parent.someFunction tries to execute here
|-Iframe    <== this is where I'm expecting parent.parent to target and where parent.parent.someFunction exists
  |-Frameset
    |-Frame <== Javascript executes here calling parent.parent.someFunction

... parent.parent似乎指的是包含<iframe>而不是<iframe>本身的文档。

如何定位parent.parent.someFunction中的<iframe>?在我的情况下,我需要以某种方式代理parent.parent,因为我无法轻松编辑包含parent.parent的代码(请参阅下面的用例中的原因)

进一步的研究将我带到了这些页面:

JavaScript: Windows and Frames

http://archive.oreilly.com/javascript/excerpt/jstdg_ch13/graphics/js4_1304.gif

Javascript: The Definitive Guide:

页面356:

  

如果框架包含在顶级窗口所包含的另一个框架内,则该框架可以将顶级窗口称为parent.parent

     

<iframe>元素具有contentWindow属性,该属性引用框架的Window对象

我的用例

我想解释一下我为什么要这样做。

我的具体用例:我正在尝试显示从 Visio&gt;生成的网页导出到<iframe>内的网页完整

从Visio导出的代码使用<frameset><frame>标记来实现页面的菜单,小部件和内容区域:

</head>
<frameset id="frmstOuter" cols="237,*">
    <frame src="0.1_files/toolbar.htm" name="frmToolbar" id="frmToolbar" title="This frame contains tools for manipulating your drawing." frameborder="6" bordercolor="#999999" scrolling="no" marginheight="0" marginwidth="0" >
    <frame src="0.1_files/png_1.htm" name="frmDrawing" title="This frame contains the pages of your drawing." marginheight="10" marginwidth="10" onload="if (parent.isUpLevel) FramePageLoaded()" >

    <noframes>
        <body>

            <h1>KPI Request Process</h1>
            <ul>
            <li><a href="0.1_files/png_1.htm">KPI Change Request Process</a></li>
            <li><a href="0.1_files/png_2.htm">KPI Assessment</a></li>
            <li><a href="0.1_files/png_3.htm">Activate KPI</a></li>

            </ul>
        </body>
    </noframes>
</frameset>

如果我在IE中加载它,它会加载到Silverlight应用程序中。 Silverlight的使用似乎都取决于parent.isUpLevel - 如果检测到支持Silverlight的浏览器,则设置为true

我编写了一些使用代理设计模式的JavaScript来挂钩某些beforecomposeafter事件,以便我可以自定义应用程序行为而无需编辑原始源代码(因为它是生成的)。我这样做是因为我希望能够在另一个网页中使用Visio导出代码,并让Visio图表中的事件触发我的应用程序中的事件。例如,单击图表中的流程将过滤我的应用程序中的视图。

所以我将上面的页面带到我的应用程序中:

<iframe id="ProcessExplorer" style="width:100%; height: 800px; border: none" src="/Content/Processes/0.1.htm"></iframe>

一旦我这样做,我收到错误消息:

Object doesn't support property or method 'FindShapeXML'

指向这一行:

var shapeNode = parent.parent.FindShapeXML (pageID, shapeID);

当我将框架集加载到其原始页面而不是将该页面放入<iframe>时,这行代码运行正常。

根据上面的文章,我尝试按如下方式修补parent.parent,但它没有解决我的问题:

parent.parent = parent.parent.document.getElementById('ProcessExplorer').contentWindow;

...我猜这不起作用,因为parent.parent是受保护对象?如果我尝试设置parent.parent = 'somestring'它也没有效果......

有没有办法在我这里实现我想要的东西 - 即代理parent.parent以便它指向我的iframe#ProcessExplorer而不是top窗口???

0 个答案:

没有答案