【问题标题】:How to get the iframe element in the parent document from the child document in a cross domain iframe?如何从跨域iframe中的子文档中获取父文档中的iframe元素?
【发布时间】:2012-11-14 12:50:08
【问题描述】:

我有这段代码会做相反的事情:获取给定 iframe element 的子文档:

var htmlWindow = (element as IHTMLFrameBase2).contentWindow;
if (htmlWindow == null) return null;
// Convert IHTMLWindow2 to IWebBrowser2 using IServiceProvider.
IServiceProvider sp = (IServiceProvider)htmlWindow;
// Use IServiceProvider.QueryService to get IWebBrowser2 object.
Object brws = null;
//brws = 
sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out brws);
// Get the document from IWebBrowser2.
SHDocVw.IWebBrowser2 browser = (SHDocVw.IWebBrowser2)(brws);
return (IHTMLDocument2)browser.Document;

我的问题是我该如何做相反的事情?我试着给孩子document做这个,但我得到一个空的frameWindow

Object frameWindow;
IServiceProvider isp = (IServiceProvider)document.parentWindow;
isp.QueryService(ref IID_IWebBrowserApp, ref IID_IHTMLFrameBase, out frameWindow);

以下是所有 GUID 供您参考:

private static Guid IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
private static Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11D0-8A3E-00C04FC9E26E");
private static Guid IID_IHTMLFrameBase2 = new Guid("3050F6DB-98B5-11CF-BB82-00AA00BDCE0B");
private static Guid IID_IHTMLFrameBase = new Guid("3050F311-98B5-11CF-BB82-00AA00BDCE0B");
private static Guid IID_IHTMLWindow2 = new Guid("332C4427-26CB-11D0-B483-00C04FD90119");

这是我的IServiceProvider

[ComImport(), ComVisible(true), Guid("6D5140C1-7436-11CE-8034-00AA006009FA"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
private interface IServiceProvider
{
    [return: MarshalAs(UnmanagedType.I4)]
    [PreserveSig]
    int QueryService(ref Guid guidService, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppvObject);
}

【问题讨论】:

    标签: c# internet-explorer mshtml shdocvw


    【解决方案1】:

    实际上,您将无法从主浏览器获取 Iframe 文档/元素。您必须执行 javascript。就我而言,幸运的是,我的目标网站中提供了 jquery,因此我使用以下 express 从内部 iframe 之一获取一些文本。

    我这样做了:

       var tmp = browser.Document.InvokeScript("eval", new object[] { "$(\"#iframe_id\").contents().find('#element').html())" });
    

    在你的情况下,如果你真的想对目标 iframe 中某个元素的 html 做某事,那么你应该准确地抓取它的 html,然后在主浏览器窗口中创建一个空元素,并用你的那个更新它的 html抓住并做你的事情。

    这是我目前找到的唯一方法。

    【讨论】:

      猜你喜欢
      • 2014-11-28
      • 2011-12-25
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 2011-04-29
      • 2012-11-10
      • 2011-06-11
      • 1970-01-01
      相关资源
      最近更新 更多