尝试检测是否在MSHTML中的DOM中添加或删除了新元素。有这样的事件会发生吗?在MSHTML IE8中修改DOM时是否会触发事件?
http://msdn.microsoft.com/en-us/library/aa741877(v=VS.85).aspx
在IE9中有IDOMMutationEvent :: initMutationEvent
http://msdn.microsoft.com/en-us/library/ff975905(v=vs.85).aspx
尝试检测是否在MSHTML中的DOM中添加或删除了新元素。有这样的事件会发生吗?在MSHTML IE8中修改DOM时是否会触发事件?
http://msdn.microsoft.com/en-us/library/aa741877(v=VS.85).aspx
在IE9中有IDOMMutationEvent :: initMutationEvent
http://msdn.microsoft.com/en-us/library/ff975905(v=vs.85).aspx
是的,它现在可能在IE8中,尽管它不是MSHTML事件结构的一部分,而是可访问性。
触发(EVENT_OBJECT_REORDER)在IE8是新的 - 见http://blogs.msdn.com/b/ie/archive/2008/12/10/new-accessibility-features-in-ie8.aspx?PageIndex=7
我们用了BHO使用它,但你同样可以勾IE之外的,如果你选择。
BHOClass::BHOClass()
{
if(TrackDHTML) {
// end event is not used so +1.
// out of process notifications from accessibility
m_eHook = ::SetWinEventHook(EVENT_OBJECT_REORDER, EVENT_OBJECT_REORDER+1, 0, MSAALib_WinEventProc, GetCurrentProcessId(), GetCurrentThreadId(), WINEVENT_OUTOFCONTEXT);
// in process injecting the dll into IE
// m_eHook = ::SetWinEventHook(EVENT_OBJECT_REORDER, EVENT_OBJECT_REORDER+1, GetModuleHandle(L"yourhook.dll"), MSAALib_WinEventProc, GetCurrentProcessId(), GetCurrentThreadId(), WINEVENT_INCONTEXT);
}
}
这里是你会如何看待可访问性和获取文档/浏览器
static void CALLBACK MSAALib_WinEventProc(HWINEVENTHOOK hook,
DWORD event,
HWND hwnd, // this appears to be the hwnd for the tab and not the specific frame
LONG idObject,
LONG idChild,
DWORD dwEventThread, // the thread being watched that triggered this call
DWORD dwmsEventTime)
{
if(hwnd != NULL // exclude most mouse move
&& (OBJID_WINDOW == idObject) // || OBJID_CLIENT == idObject)
)
{
switch(event) {
case EVENT_OBJECT_REORDER: break;
case EVENT_OBJECT_SHOW: break;
case EVENT_OBJECT_HIDE: break;
default:
return;
}
Log(L"Event START - (%ld) object %ld on window(0x%x)%ld thread (0x%x)%ld\n", event, idObject, hwnd, hwnd, dwEventThread, dwEventThread);
CComPtr<IAccessible> acc;
VARIANT varChild;
AccessibleObjectFromEvent(hwnd, idObject, idChild, &acc, &varChild);
if(acc) {
// step 1 - change from Accessibility interface to html to check we have right type of reorder message
CComPtr<IServiceProvider> provider;
HRESULT hr = acc->QueryInterface(IID_IServiceProvider,(LPVOID *)&provider);
if(SUCCEEDED(hr) && provider){
CComPtr<IHTMLElement> spElement;
hr = provider->QueryService(IID_IHTMLElement,IID_IHTMLElement,(LPVOID *)&spElement);
if(spElement) {
// step 2 - for this doc element get the service provider and then the browser element
CComPtr<IServiceProvider> provider2;
HRESULT hr = spElement->QueryInterface(IID_IServiceProvider,(LPVOID *)&provider2);
CComPtr<IServiceProvider> provider3;
if(provider2)
hr = provider2->QueryService(SID_STopLevelBrowser,IID_IServiceProvider,(LPVOID *)&provider3);
CComPtr<IWebBrowser2> browser;
if(provider3)
hr = provider3->QueryService(SID_SWebBrowserApp,IID_IWebBrowser2,(LPVOID *)&browser);
if(browser) {
// step 3 - Do stuff
}
}
}
}
Log(L"Event DONE - (%ld) object %ld on window(0x%x)%ld thread (0x%x)%ld\n", event, idObject, hwnd, hwnd, dwEventThread, dwEventThread);
}
}
这有点晚,但是有没有办法在JavaScript中钩住这个事件? – thednp 2017-01-15 10:49:05
没有,但是如果你通过一个类库如jQuery you can fake the event by yourself修改DOM。
我不想修改DOM。我试图检测DOM何时被修改,而不是通过JavaScript。我在应用程序中托管了MSHTML。 – GeorgeU 2011-02-24 22:42:22
如果您的容器处于设计模式,您可以使用IMarkupContainer2 :: CreateChangeLog,否则您可以使用IDispatchEx覆盖每个元素的每个DOM更改方法/属性(appendchild,outerhtml,innerhtml,文本,样式等) – 2011-02-25 15:03:17
你跟MSHTML对象的工作集是从WBC得到什么? – abatishchev 2011-02-26 01:29:53