应用程序正在使用 IE WebBrwoser 控件。但是有时会出现 javascript 错误对话框,以解决在 WebBrowser 元素上使用了这个 put_silent 属性,但这会禁用所有对话框。那么有没有办法在 WebBrowser 控件中禁用 Javascript 错误调试?
最佳答案
在您的控件上右键单击并单击检查元素。如果您没有禁用 IE 菜单,它应该会在右侧或底部打开开发人员窗口。选择“调试”选项卡,单击六边形并选中“不要停止异常”或“停止未处理的异常”。我相信这是浏览器的全局设置,所以你也许可以只从 IE 中完成。
更新 1
首先实现 IDocHostUIHandler 并包装外部处理程序调用。它在 Mshtmhst.h 中声明,因此您可能必须包含它。不要忘记IUnknown成员,也必须被包裹。 ATL 向导可用于实现接口(interface),但无论如何您必须准确了解您所做的:
class MyDocHostUIHandler: public IDocHostUIHandler
{
public:
IDocHostUIHandler* externalHandler;
HRESULT EnableModeless( BOOL fEnable)
{
return externalHandler->EnableModeless(fEnable);
}
HRESULT FilterDataObject(IDataObject* pDO, IDataObject** ppDORet)
{
return externalHandler->FilterDataObject(pDO, ppDORet)ș
}
.... Wrap all the functions from External Handler like above
};
创建你的类的一个实例:
MyDocHostUIHandler* myHandler = new MyDocHostUIHandler();
然后在您的代码调用中,就像在 MSDN 中指定的那样。
首先你得到 MSHTML 对象
CComPtr<IHTMLDocument2> m_spDocument;
hr = m_WebBrowser->get_Document(&m_spDocument);// Get the MSHTML object
然后你得到现有的默认处理程序
ComPtr<IOleObject> spOleObject;
hr = m_spDocument.As(&spOleObject);
ComPtr<IOleClientSite> spClientSite;//<--this will be the default handler
hr = spOleObject->GetClientSite(&spClientSite);
将现有的处理程序保存到您的类中,这样您就可以包装它的功能
//see myHandler is the instance of interface you implemented in first step
myHandler->externalHandler = spClientSite;
获取自定义文档:
ComPtr<ICustomDoc> spCustomDoc;
hr = m_spDocument.As(&spCustomDoc);//m_spDocument it is the pointer to your MSHTML
现在从 HSMTML 替换处理程序:
//myHandler is the instance of class you implemented above
spCustomDoc->SetUIHandler(myHandler);
在这一步之后,MSHTML 应该不会注意到任何东西,但是您将能够在 MyDocHostUIHandler 类中添加断点,并查看您的 MSHTML 调用了哪个函数以及何时调用。
关于javascript - 如何在 IE WebBrowser 控件中禁用 javascript 错误调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61139134/