2011-02-24 12 views
5

नए तत्व जोड़े या MSHTML में डोम से हटा रहे हैं का पता लगाने की कोशिश कर रहा। क्या ऐसी घटना है जो आग लग जाएगी?क्या ऐसी कोई घटना है जो एमओएमटीएम आईई 8 में डीओएम संशोधित होने पर आग लगती है?

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

+0

मिल आप MSHTML वस्तु के साथ काम कर रहे हैं WBC से प्राप्त किया जा रहा है सेट किया गया है? – abatishchev

उत्तर

5

हाँ, यह संभव अब 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); 
} 
} 
+0

पर किसी भी डोम से संबंधित घटनाओं के लिए यह थोड़ी देर हो चुकी है, लेकिन वहां जावास्क्रिप्ट में इस घटना को हुक करने के लिए एक तरीका है? – thednp

0

नहीं है, लेकिन अगर आप JQuery you can fake the event by yourself की तरह एक वर्ग पुस्तकालय के माध्यम से डोम संशोधित करते हैं।

+0

मैं डोम को संशोधित करने की कोशिश नहीं कर रहा हूं। मैं पता लगाने की कोशिश कर रहा हूं कि डीओएम कब संशोधित है, और जावास्क्रिप्ट के माध्यम से नहीं। मेरे पास एक आवेदन में होस्ट किया गया एमएसएचटीएमएल है। – GeorgeU

+0

अपने कंटेनर डिज़ाइन मोड में है, तो आप IMarkupContainer2 :: CreateChangeLog उपयोग कर सकते हैं, अन्यथा आप हर तत्व –

0

कैसे WebBrowser1.Document.AttachEventHandler() के बारे में?

+0

यह प्रतीत नहीं होता है के लिए हर डोम परिवर्तन विधि/संपत्ति (appendChild, outerhtml, innerHTML, पाठ, शैली, आदि) ओवरराइड करने के लिए उपयोग कर सकते हैं IDispatchEx IE8 – GeorgeU

संबंधित मुद्दे