VS C# .NET WebBrowser控件 利用插入JS代码,实现控制弹出IE窗口

最近在做一个客户端程序,使用到自带的WebBrowser控件时,发现当JS调用window.open()或a标签的target="_blank"时使用的是弹出IE窗口,不知道为什么是这种设计,根本不满足需求嘛。上网查了一下相关资料,发现这个控件并没有属性能控制这个功能,于是找第三方控件,发现也还是不行(可能是我不够仔细尝试),而且要多出个几十兆的DLL。经过我几个小时的努力,放弃了。。。!

知道C#是可以与网页的JS交互的,于是想到网页上重写window.open()的方法,建一个HTML页面试一下,证实JS重写window.open()的可能,JS代码:

window.open=function(url){window.location.href=url;}

试运行,成功被重写了。

由于网页我是不能更改的,于是参考到C# WebBrowser执行JS代码的方法:

IHTMLDocument2 doc2 = (IHTMLDocument2)webBrowser1.Document.DomDocument;
doc2.parentWindow.execScript("window.open=function(url){window.location.href=url;}");

?????一切OK,但有一个问题,就是这个方法使用到IHTMLDocument2,需要引用Microsoft.mshtml.dll,这个dll是自带的,位置一般在 C:\Program Files\Microsoft.NET\Primary Interop Assemblies,有近8M,我当然不能忍啊,于是继续在这条路上越走越深。?

是后使用了不需要引用外部dll的方法,直接用HtmlDocument就可以的:?

HtmlDocument doc = webBrowser1.Document;
HtmlElement script = doc.CreateElement("script");
script.SetAttribute("type", "text/javascript");
script.SetAttribute("text", "window.open=function(url){window.location.href=url;}");
doc.Body.AppendChild(script);

当然你也将JS可以写成方法,然后用 doc.InvokeScript()调用,这里我就不管了。

这时又有一个问题,这个代码时在当前的Document有效,也就是说HTML里面的iframe包含的HTML并不会生效,解决:

//上面的doc改成:
doc = webBrowser1.Document.Window.Frames["iframe的name"].Document;

如果多个iframe的话遍历一下就好了。

最后再把a标签的target改一下就好了,终于完成了,这里记录分享一下~

转载请尊重原创,OK?

时间: 2024-08-11 17:45:56

VS C# .NET WebBrowser控件 利用插入JS代码,实现控制弹出IE窗口的相关文章

SELECT控件操作的JS代码示例

1 检测是否有选中 if(objSelect.selectedIndex > -1) { //说明选中 } else { //说明没有选中 } 2.动态创建select function createSelect(){ var mySelect = document.createElement_x("select"); mySelect.id = "mySelect"; document.body.appendChild(mySelect); } 3.添加选项

jquery实现页面控件拖动效果js代码

;(function($) { var DragPanelId = "divContext"; var _idiffx = 0; var _idiffy = 0; var _Div = null; $.extend({ AttachDrag: function(dragId) { if (dragId) $._Div = document.getElementById(dragId); else $._Div = document.getElementById($.DragPanelI

对常用控件添加长按复制及自定义弹出menu

#import "FeedbackLabel.h" @implementation FeedbackLabel /* // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { // Drawing code } */

webbrowser 控件实现WinForm与WebForm交互

WebBrowser 控件可以让你装载Windows Form 应用程序中的 Web 网页和其它采用浏览器的文件.可以使用webbrowser 控件将现有的web框架控制项加入至 Windows Form 客户端应用程序.还是直接看代码吧. WebBrowser 控制项 提供的属性.方法和事件,可用来实现 Internet Explorer 的控制项    webBrowser1.Navigate("www.cnblogs.com");    //将指定位置处的文件载入至 WebBro

Webbrowser控件判断网页加载完毕的简单方法

一般情况下,当ReadyState属性变成READYSTATE_COMPLETE时,Webbrowser控件会通过触发DocumentCompleted事件来指示网页加载完毕.但当加载的网页包含frame时,可能会多次触发该事件,所以不能简单地通过它来判断网页加载完毕.从微软的官方网站上了解到,并非每个frame都对应了一个DocumentCompleted事件,只有触发了DownloadBegin事件的frame才会有相应的DocumentCompleted事件.另外,最外层的frame总是最

如何控制WebBrowser控件不下载图片

Sidyhe在http://blog.csdn.net/sidyhe/article/details/9073485 一文中,利用C++以及Windows SDK实现了WebBrowser控件的容器. 我们可以在Sidyhe的基础上,简单修改CXWebBrowser类,即可控制其在访问页面时,不下载图片(对其他下载资源的控制可参照图片的). 具体实现只要修改Invoke函数即可,原来的Invoke函数如下: HRESULT CXWebBrowser::Invoke(DISPID dispIdMe

C# WebBrowser控件 模拟登录 抓取数据

参考博客:C#中的WebBrowser控件的使用 参考博客:C#中利用WebBrowser控件,获得HTML源码 一.问题点: 1.模拟登录后,如果带有嵌套的iframe嵌套,不好读取iframe内容,可以直接指定iframe抓取网址 2.C# 清除WebBrowser控件的Session和Cookie 参考文档:http://www.360doc.com/content/14/0810/12/9200790_400769010.shtml 代码如下: [DllImport("wininet.d

Delphi WebBrowser控件的使用(大全 good)

Delphi WebBrowser控件的使用 WebBrowser控件属性:1.Application      如果该对象有效,则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDispatch).如果在宿主对象中自动化对象无效,程序将返回WebBrowser控件的自动化对象2.Parent       返回WebBrowser控件的父自动化对象,通常是一个容器,例如是宿主或IE窗口3.Containe       返回WebBrowser控件容器的自动化对象.通常该值与Pare

[转载]WebBrowser控件表单(form)的自动填写和提交

话说有了WebBrowser类,终于不用自己手动封装SHDocVw的AxWebBrowser这个ActiveX控件了.这个类如果仅仅作为一个和IE一模一样浏览器,那就太没意思了(还不如直接用IE呢).那么,无论我们是想做一个"定制版IE",还是希望利用HTML来做用户界面(指WinApp而非WebApp.许多单机软件,包括Windows的帮助支持中心,都是HTML做的),都少不了Windows Form和包含在WebBrowser中的Web页面的交互.本文将通过几个实际的例子,初步介绍