是否有当DOM在MSHTML IE8被修改的触发一个事件? [英] Is there an event that fires when DOM is modified in MSHTML IE8?

查看:171
本文介绍了是否有当DOM在MSHTML IE8被修改的触发一个事件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

试图检测是否新元素被添加或从MSHTML DOM中除去。是否有将触发这样的事件?

Trying to detect if new elements are added or removed from the DOM in MSHTML. Is there such event that will fire?

http://msdn.microsoft.com /en-us/library/aa741877(v=VS.85).aspx

在IE9有IDOMMutationEvent :: initMutationEvent

In IE9 there is IDOMMutationEvent::initMutationEvent

http://msdn.microsoft.com /en-us/library/ff975905(v=vs.85).aspx

推荐答案

是的,现在可以在IE8,虽然它不是MSHTML事件结构的一部分,但辅助。

Yes, it is possible now in IE8, though it is not part of the MSHTML event structure, but Accessibility.

触发(EVENT_OBJECT_REORDER)在IE8是新​​的 - 请参阅<一个href=\"http://blogs.msdn.com/b/ie/archive/2008/12/10/new-accessibility-features-in-ie8.aspx?PageIndex=7\" rel=\"nofollow\">http://blogs.msdn.com/b/ie/archive/2008/12/10/new-accessibility-features-in-ie8.aspx?PageIndex=7

Trigger (EVENT_OBJECT_REORDER) is new in IE8 - See http://blogs.msdn.com/b/ie/archive/2008/12/10/new-accessibility-features-in-ie8.aspx?PageIndex=7

我们用了BHO使用它,但你同样可以勾IE浏览器之外,如果你选择。

We use it with out BHO, but you could equally hook outside of IE if you choose.

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 );
}
}

这里是你可能如何看待可访问性和获取文档/浏览器

And here is how you might look at the accessibility and get the document/browser

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);
}
}

这篇关于是否有当DOM在MSHTML IE8被修改的触发一个事件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆