2011-02-24 15 views
5

Cố gắng phát hiện xem các phần tử mới được thêm vào hoặc bị xóa khỏi DOM trong MSHTML hay chưa. Có sự kiện như vậy sẽ cháy?Có sự kiện nào xảy ra khi DOM được sửa đổi trong MSHTML IE8 không?

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

Trong IE9 có IDOMMutationEvent :: initMutationEvent

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

+0

bạn đang làm việc với đối tượng MSHTML thiết bị get từ WBC? – abatishchev

Trả lời

5

Có, bây giờ có thể trong IE8, mặc dù nó không phải là một phần của cấu trúc sự kiện MSHTML, nhưng Khả năng truy cập.

Kích hoạt (EVENT_OBJECT_REORDER) là mới trong IE8 - Xem http://blogs.msdn.com/b/ie/archive/2008/12/10/new-accessibility-features-in-ie8.aspx?PageIndex=7

Chúng tôi sử dụng nó với ra BHO, nhưng bạn đều có thể treo bên ngoài của IE nếu bạn chọn.

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

Và đây là cách bạn có thể nhìn vào khả năng tiếp cận và nhận được tài liệu/trình duyệt

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

Đây là một chút trễ, nhưng có cách nào để móc sự kiện này trong JavaScript không? – thednp

0

Không, nhưng nếu bạn sửa đổi DOM qua một thư viện lớp như JQuery you can fake the event by yourself.

+0

Tôi không cố gắng sửa đổi DOM. Tôi đang cố gắng phát hiện khi DOM được sửa đổi và không thông qua JavaScript. Tôi có MSHTML được lưu trữ trong một ứng dụng. – GeorgeU

+0

Nếu vùng chứa của bạn đang ở chế độ thiết kế, bạn có thể sử dụng IMarkupContainer2 :: CreateChangeLog, nếu không bạn có thể sử dụng IDispatchEx để ghi đè mọi phương thức thay đổi DOM/thuộc tính (appendchild, outerhtml, innerhtml, văn bản, kiểu, v.v.) cho mọi thành phần –