在WebBrowser
组件中加载的网页的iFrame中加载的某些网页在关闭网页时会弹出一个确认窗口。此确认窗口阻止主网页关闭,因此我必须单击选项离开页面。我想通过更改iFrame中加载的网页的onbeforeunload
事件来避免这种情况。
我尝试修改this solution并将其应用于我的案例。但是,似乎该解决方案仅在访问WebBrowser
内加载的页面的事件时适用,而不是在其内部的iFrame中加载。
所以这就是我的尝试。
我首先从上面提到的解决方案中声明了接口:
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("00020400-0000-0000-C000-000000000046")]
public interface IDispatch
{
[PreserveSig]
int GetTypeInfoCount(out int Count);
[PreserveSig]
int GetTypeInfo(
[MarshalAs(UnmanagedType.U4)] int iTInfo,
[MarshalAs(UnmanagedType.U4)] int lcid,
out ITypeInfo typeInfo
);
[PreserveSig]
int GetIDsOfNames(
ref Guid riid,
[MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] string[] rgsNames,
int cNames,
int lcid,
[MarshalAs(UnmanagedType.LPArray)] int[] rgDispId
);
[PreserveSig]
int Invoke(
int dispIdMember,
ref Guid riid,
uint lcid,
ushort wFlags,
ref System.Runtime.InteropServices.ComTypes.DISPPARAMS pDispParams,
out object pVarResult,
ref System.Runtime.InteropServices.ComTypes.EXCEPINFO pExcepInfo,
IntPtr[] pArgErr
);
}
然后,我想将onbeforeunload
事件设置为null
或以某种方式删除它的内容,以便弹出窗口不会弹出。
HTMLDocument document = (HTMLDocument)webBrowser2.Document.DomDocument;
// iFrame's id is "iF".
HTMLFrameElement frame = (HTMLFrameElement)document.getElementById("iF");
IHTMLWindow2 window = frame.contentWindow;
// Everything works fine until the following line.
var event = (ExtendedWebBrowser.IDispatch)window.onbeforeunload;
// Although no exception is thrown, event variable is always null, no matter if the webpage in the iFrame has or does not have onbeforeunload event specified.
// Setting the event to null does nothing. I'd have to come up with how to read this event before trying to set it to something.
window.onbeforeunload = null;
所以我的最后一个问题是:如何获取和设置在WebBrowser控件中加载的网页的iFrame中加载的网页的onbeforeunload事件(或任何其他事件)?
随意请求任何进一步的解释。提前谢谢。
应用程序例程的进一步说明。
应用程序按顺序导航到网页列表。处理完每个页面后,需要关闭它,然后加载下一个页面。每个网页都有一个iframe,后者又从不同的域加载网页。我对该应用程序没有任何问题,除非iframe中加载的网页在其confirm
事件中调用popup
或onbeforeunload
。确认弹出框阻止应用程序处理更多网页。我需要摆脱这个弹出确认窗口。
答案 0 :(得分:1)
如果您遇到弹出式弹出窗口的问题,我已经为您提供了一个解决方案,如果您想在客户端计算机上禁用/启用javascript(甚至只是在启用/禁用时读取/查询)ive包括你的答案,我们走了:
您要禁用哪条弹出式消息?如果它是警告消息,请尝试这一点,显然根据您的特定需求解析窗口或框架对象,我只假设顶级文档,但如果您需要iframe,则可以使用window.frames(0)访问它。对于第一帧等等...(重新编写JavaScript部分)...这里有一些代码,假设WB是你的webbrowser控件......
WB.Document.parentWindow.execScript "window.alert = function () { };", "JScript"
但是,在您的情况下,由于您要禁用打印,只需将.alert
换成.print
。
只有在整个页面加载完毕后才能运行上面的代码,我知道这很难做到(并且还没有发布完整的版本)但是我一直这样做(完全证明)现在已经有一段时间了,如果您阅读我以前的一些标记为“webbrowser”和“webbrowser-control”的答案,您可以收集有关如何准确执行此操作的提示,但如果您想要取消,请回到手头的问题.confirm JavaScript消息,只需用window.confirm替换window.alert(当然,使用正确的对象限定窗口。对象以到达您正在使用的文档层次结构)。您也可以使用上述技术和新的IE9 .prompt方法禁用.print方法。
这是一个常量字符串(在VB中声明),它将摆脱4个弹出窗口,包括新的IE9弹出窗口。此外,它将摆脱onbeforeunload事件,它将在其运行的每个页面上执行所有这些操作。如果你有框架,你也不需要在框架中运行它们,只需在父文档中运行就足够了。在这里(在VB6中声明),_只是为了延伸而我放在那里以便于阅读,&用于字符串连接,并且;在javascript中只是意味着将下面的内容视为另一行代码。这样,您可以在一个物理行中运行多行代码(下面,我认为5)。
Public Const DEFAULT_JS_TO_RUN_AFTER_EACH_PAGE_LOAD As String = _
& "window.alert = function () { }; window.confirm = function () { }; " _
& "window.prompt = function () { }; window.print = function () { }; " _
& "window.onbeforeunload = function () { };"
如果要完全禁用JavaScript,可以使用注册表执行此操作,并且必须在webbrowser控件加载到内存之前更改注册表,并且每次更改它(on& off)时必须重新加载webbrowser控制进入内存(或只是重启你的应用程序)。
注册表项是 \ HKEY_CURRENT_USER \ SOFTWARE \微软\的Windows \ CurrentVersion \互联网 Settings \ Zones \ - 键名为1400,禁用它的值为 3,并使其为0。
当然,因为Zones键下有5个区域,您需要为活动区域或所有区域更改它以确保。但是,如果你想要做的只是supress js对话框弹出消息,你真的不需要这样做。
请告诉我你的进展情况,以及我是否可以继续提供帮助。