2011-02-24 10 views
5

MSHTML'de yeni öğeler eklendiğinde veya DOM'dan kaldırılıp kaldırılmadığını belirlemeye çalışın. Ateş edecek böyle bir olay var mı? Eğer JQuery you can fake the event by yourself gibi bir sınıf kitaplığı aracılığıyla DOM değiştirirseniz IE9 iseDOM, MSHTML IE8'de değiştirildiğinde değiştirilen bir olay var mı?

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

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

+0

olsun MSHTML nesnesi ile çalışıyor musunuz WBC dan olsun olmanın ayarlayabilirsiniz nasıl? – abatishchev

cevap

5

Evet, MSHTML olay yapısının bir parçası olmamasına rağmen, Erişilebilirlik artık IE8'de mümkündür. Biz BHO dışarı ile kullanmak http://blogs.msdn.com/b/ie/archive/2008/12/10/new-accessibility-features-in-ie8.aspx?PageIndex=7

Bak, ama dilerseniz eşit IE dışında kanca olabilir -

Tetik (EVENT_OBJECT_REORDER) IE8 yenidir. Burada

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

Ve erişilebilirlik bakıp belge/tarayıcı

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

Bu biraz gecikmeli, ancak bu olayı JavaScript'te çekmenin bir yolu var mı? – thednp

0

Hayır

IDOMMutationEvent :: initMutationEvent

, ama olmaz.

+0

DOM'ı değiştirmeye çalışmıyorum. DOM'ın ne zaman değiştirileceğini anlamaya çalışıyorum ve JavaScript ile değil. MSHTML bir uygulamada barındırılıyor. – GeorgeU

+0

Kapsayıcınız tasarım modundaysa, IMarkupContainer2 :: CreateChangeLog öğelerini kullanabilirsiniz, aksi takdirde her öğeye ilişkin tüm DOM değişiklik yöntemlerini/özelliklerini (appendchild, dışhtml, innerhtml, metin, stil vb.) Geçersiz kılmak için IDispatchEx'i kullanabilirsiniz. –