我试图在嵌套在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
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来挂钩某些before
,compose
和after
事件,以便我可以自定义应用程序行为而无需编辑原始源代码(因为它是生成的)。我这样做是因为我希望能够在另一个网页中使用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
窗口???