由于很变态的中国式需求,我们需要在自己的网站中,嵌入第三方厂商的网站。
而这个第三方的网站中,使用了几层的iFrame,同时使用了基于IE的Activex控件。
由于双方的控件风格差距太大,所以需要替换CSS样式,同时要删掉部分与我们网站冲突的内容。
想了几种方法:
1、说服对方进行调整,但经过接触,了解到其超级不靠谱,只能靠自己了。
2、直接通过iFrame嵌入对方网站,用JS进行修改。可是跨站修改,浏览器不同意啊。
3、自己写个控件,嵌入到自己网页中,在控件中调用对方URL,并通过WebBrowser控件修改CSS及HTML。问题是,IE中,不能再直接嵌入一个WebBrowser控件,主要出于安全考虑。(如果IE允许这样操作的话,我只需要在WebBrowser中指向同一个URL,就可以无限调用,耗光资源,其他的事情,有太多可以做了)自己用很挫的方法实现了这个功能,后来考虑到稳定性,放弃了。
4、使用非基于IE的Web插件,在控件中调用对方URL,并通过控件修改CSS及HTML。比如Flash或者CefSharp,但问题是,非IE核心如何调用Activex控件啊。
5、限制入口,基于WebBrowser定制IE浏览器
最后使用了方法5,说实话,真烦。
这里把通过WebBrowser修改CSS及HTML的方法说一下,下面是我写的一段测试用代码,请按自己的实际情况修改:
//替换样式 //webMain是WebBrowser控件的名称 //NewStyle.css中是要替换的样式 private void modifyStyle() { int frameNum = webMain.Document.Window.Frames.Count; if (frameNum == 2) { IHTMLDocument2 leftIFrame = webMain.Document.Window.Frames[0].Document.DomDocument as IHTMLDocument2; int length = leftIFrame.styleSheets.length; IHTMLStyleSheet styleSheet = leftIFrame.createStyleSheet(@"", length + 1); TextReader reader = new StreamReader(Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "NewStyle.css")); string style = reader.ReadToEnd(); styleSheet.cssText = style; } } //删除tree节点下的div,只保留特定的一个节点 private void delDiv(String flowid) { int frameNum = webMain.Document.Window.Frames.Count; if (frameNum == 2) { IHTMLDocument3 leftIFrame = webMain.Document.Window.Frames[0].Document.DomDocument as IHTMLDocument3; foreach (dynamic e in leftIFrame.getElementById("tree").children) { String ret = e.InnerText; if (!ret.Contains(flowid)) { e.parentNode.removeChild(e); } } } }