由于项目需求,最近转战客户端,开始搞浏览器开发。众所周知,现在在微软平台上开发浏览器,最常用的方法就是扩展Webbrowser,但是首先要清楚的是,WebBrowser控件仅仅是对WebBrowser ActiveX 控件提供了托管包装而已(详细了解http://msdn.microsoft.com/zh-cn/library/w290k23d(VS.80).aspx),要写一个像点样子的浏览器,很多方面还是要自己去扩展的,否则开发出来的也只能是个样子,没多少实际功能。
本篇随笔重点将介绍如何处理WebBrowser对JS的错误处理问题。 可能有些朋友看到上句话会觉得,这问题不是很简单嘛,设置一下 ScriptErrorsSuppressed属性不就完了嘛,殊不知这样做,像其他的譬如网页安全验证的弹出框,甚至很多其他网页内部弹出窗口也都被禁止掉了,如此当然是行不通的。可能还会有一部分朋友会说,那可以通过WebBrowser向网页中注入JS错误处理脚本,捕获JS错误,不是也可以嘛。那我会告诉你,这种方法在面对使用很多iframe的网站是也玩完。 那么接下来,我将介绍,如何更好的避免WebBrowser中的JS错误。 避免错误,首先要想到办法去捕获错误,查遍了网上的很多资料,发现是要去实现IOleCommandTarget接口,调用接口中的Exec方法来捕获异常,然后解决,当然如果需要去调用IE的一些功能,也得需实现IObjectWithSite接口。 定义IOleCommandTarget接口、OLECMD类: public static class NativeMethods
{
public enum OLECMDF
{
// Fields
OLECMDF_DEFHIDEONCTXTMENU = 0x20,
OLECMDF_ENABLED = ,
OLECMDF_INVISIBLE = 0x10,
OLECMDF_LATCHED = ,
OLECMDF_NINCHED = ,
OLECMDF_SUPPORTED =
} public enum OLECMDID
{
// Fields
OLECMDID_PAGESETUP = ,
OLECMDID_PRINT = ,
OLECMDID_PRINTPREVIEW = ,
OLECMDID_PROPERTIES = ,
OLECMDID_SAVEAS = ,
OLECMDID_SHOWSCRIPTERROR =
}
public enum OLECMDEXECOPT
{
// Fields
OLECMDEXECOPT_DODEFAULT = ,
OLECMDEXECOPT_DONTPROMPTUSER = ,
OLECMDEXECOPT_PROMPTUSER = ,
OLECMDEXECOPT_SHOWHELP =
} [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("B722BCCB-4E68-101B-A2BC-00AA00404770"), ComVisible(true)]
public interface IOleCommandTarget
{
[return: MarshalAs(UnmanagedType.I4)]
[PreserveSig]
int QueryStatus(ref Guid pguidCmdGroup, int cCmds, [In, Out] NativeMethods.OLECMD prgCmds, [In, Out] IntPtr pCmdText);
[return: MarshalAs(UnmanagedType.I4)]
[PreserveSig]
int Exec(ref Guid pguidCmdGroup, int nCmdID, int nCmdexecopt, [In, MarshalAs(UnmanagedType.LPArray)] object[] pvaIn, ref int pvaOut);
} [StructLayout(LayoutKind.Sequential)]
public class OLECMD
{
[MarshalAs(UnmanagedType.U4)]
public int cmdID;
[MarshalAs(UnmanagedType.U4)]
public int cmdf;
public OLECMD()
{
}
} public const int S_FALSE = ;
public const int S_OK = ; public static readonly Guid CGID_DocHostCommandHandler = new Guid("f38bc242-b950-11d1-8918-00c04fc2c836"); public const int VARIANT_TRUE = -;
public const int VARIANT_FALSE = ;
public const int OLECMDERR_E_NOTSUPPORTED = -; } 然后定义一个类ExtendedWebBrowserSite,去实现接口: class ExtendedWebBrowserSite : WebBrowserSite, NativeMethods.IOleCommandTarget
{
/// <summary>
/// Creates a new instance of the <see cref="ExtendedWebBrowserSite"/> class
/// </summary>
/// <param name="host">The <see cref="ExtendedWebBrowser"/> hosting the browser</param>
public ExtendedWebBrowserSite(ExtendedWebBrowser host)
: base(host)
{
_host = host;
} private ExtendedWebBrowser _host;
private ExtendedWebBrowser Host
{
get
{
return _host;
}
} #region IOleCommandTarget Members int NativeMethods.IOleCommandTarget.QueryStatus(ref Guid pguidCmdGroup, int cCmds, NativeMethods.OLECMD prgCmds, IntPtr pCmdText)
{
return NativeMethods.S_FALSE;
} int NativeMethods.IOleCommandTarget.Exec(ref Guid pguidCmdGroup, int nCmdID, int nCmdexecopt, object[] pvaIn, ref int pvaOut)
{
int hResult = NativeMethods.S_OK;
if (pguidCmdGroup == null)
return hResult;
// Check for invalid pointers (or get a NullReferenceException on a value type???)
//if (NativeMethods.CGID_DocHostCommandHandler.Equals(pguidCmdGroup))
{
switch (nCmdID)
{
case (int)NativeMethods.OLECMDID.OLECMDID_SHOWSCRIPTERROR:
// Hide the dialog
pvaOut = NativeMethods.VARIANT_TRUE; break;
default:
hResult = NativeMethods.OLECMDERR_E_NOTSUPPORTED;
break;
}
}
return hResult;
} #endregion }
} 当然这里主要是通过实现IOleCommandTarget.Exec方法去捕获OLECMDID.OLECMDID_SHOWSCRIPTERROR消息,然后避免异常。 最后在你的扩展的WebBrowser里面重载一下CreateWebBrowserSiteBase方法,完成调用。 protected override WebBrowserSiteBase CreateWebBrowserSiteBase()
{
return new ExtendedWebBrowserSite(this);
}

原文:http://blog.csdn.net/tangyanzhi1111/article/details/8990459

如何妥善处理WebBrowser对Javascript的错误问题,阻止JS弹出框,提高用户体验的更多相关文章

  1. JavaScript学习总结(6)——js弹出框、对话框、提示框、弹窗总结

    一.JS的三种最常见的对话框 [javascript] view plaincopy //====================== JS最常用三种弹出对话框 =================== ...

  2. 四种常见的提示弹出框(success,warning,error,loading)原生JavaScript和jQuery分别实现

    原文:四种常见的提示弹出框(success,warning,error,loading)原生JavaScript和jQuery分别实现 虽然说现在官方的自带插件已经有很多了,但是有时候往往不能满足我们 ...

  3. JavaScript中的三种弹出框的区别与使用

    JavaScript中有三种原生的弹出框,分别是alert.confirm.prompt.分别表示弹出框.确认框.信息框. 以下是示例代码: <!DOCTYPE html> <htm ...

  4. 玩转Bootstrap(JS插件篇)-第1章 模态弹出框 :1-1导入JavaScript插件

    导入JavaScript插件 Bootstrap除了包含丰富的Web组件之外,如前面介绍的下拉菜单.按钮组.导航.分页等.他还包括一些JavaScript的插件. Bootstrap的JavaScri ...

  5. form WebBrowser自动点击弹出提示框alert、弹出对话框confirm、屏蔽弹出框、屏蔽弹出脚本错误的解决办法

    针对WebBrowser控件中自动点击弹出框及禁用脚本提示问题得到如下几种实际情况的解决办法,绝对管用. 1.屏蔽弹出错误脚本 将WebBrowser控件ScriptErrorsSuppressed设 ...

  6. 经验总结:WebBrowser自动点击弹出提示框alert、弹出对话框confirm、屏蔽弹出框、屏蔽弹出脚本错误的解决办法

    经验总结:WebBrowser自动点击弹出提示框alert.弹出对话框confirm.屏蔽弹出框.屏蔽弹出脚本错误的解决办法 网上有好多解决方法,可是不一定好使,本人经过多次试验,针对WebBrows ...

  7. Jquery插件之信息弹出框showInfoDialog(成功、错误、警告、通知)

    一.信息种类说明: 1.1.操作成功信息 1.2.错误信息 1.3.警告信息 1.4.通知信息 二.使用说明 <!DOCTYPE html PUBLIC "-//W3C//DTD HT ...

  8. JavaScript总结之鼠标划过弹出div单击出现对话框

    为了满足他们的永无止境的要求,我可谓是任劳任怨啊,累断了双手,看瞎了双眼.这个是来写鼠标划过一个按钮,然后弹出一个小提示框解释,另外根据radio是否选中,判断点击后如何执行,然后执行之后再有一个确认 ...

  9. JavaScript插件——弹出框

    (JavaScript插件——弹出框) 前言 阅读之前您也可以到Bootstrap3.0入门学习系列导航中进行查看http://www.cnblogs.com/aehyok/p/3404867.htm ...

随机推荐

  1. 2019-8-31-C#-字典-Dictionary-的-TryGetValue-与先判断-ContainsKey-然后-Get-的性能对比

    title author date CreateTime categories C# 字典 Dictionary 的 TryGetValue 与先判断 ContainsKey 然后 Get 的性能对比 ...

  2. 随笔记录 linux命令 2019.7.29

    系统命令 一. type   查看命令是内部命令还是内部命令 help   帮助 man   在线帮助 cd      切换目录 pwd    查看所在路径 stat     查看文件详细信息 ls  ...

  3. python ORM框架:SqlAlchemy

    ORM,对象关系映射,即Object Relational Mapping的简称,通过ORM框架将编程语言中的对象模型与数据库的关系模型建立映射关系,这样做的目的:简化sql语言操作数据库的繁琐过程( ...

  4. 01.SpringMVC快速入门

    1.导入jar包 2.在web.xml中配置前端控制器 <!-- spring前端控制器 --> <servlet> <servlet-name>springmvc ...

  5. ReentrantLock与synchronized的区别

    1.与synchronized相比,ReentrantLock提供了更多,更加全面的功能,具备更强的扩展性.例如:时间锁等候,可中断锁等候,锁投票. 2.ReentrantLock还提供了条件Cond ...

  6. 单调栈——cf777E

    傻逼单调栈啊我怎么想了半天dp #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef st ...

  7. 字段username没有默认值查询(设计数据库一定要养成好习惯,不是主键最好设置为可以为空)

    今天创建了一个表,但是username作为外键(不是主键)没有设置为可以为空,结果提交表单时忘记写username就报错了

  8. 深夜Python - 第2夜 - 爬行

    深夜Python - 第2夜 - 爬行 我曾经幻想自己是一只蜗牛,有自己的一只小壳,不怕风,不怕雨,浪荡江湖,游历四方……夜猫兄一如既往地打断了我不切实际的幻想:“浪荡?游历?等你退休了都爬不出家门口 ...

  9. <每日一题>算法题:集合求并集并排序

    题目描述 给你两个集合,要求{A} + {B}. 注:同一个集合中不会有两个相同的元素. 输入描述: 每组输入数据分为三行,第一行有两个数字n,m(0 ≤ n,m ≤ 10000),分别表示集合A和集 ...

  10. vue 图片懒加载v-lazy

    搬运自:https://blog.csdn.net/twodogya/article/details/80223331 vue v-lazy官方API:https://www.npmjs.com/pa ...