Доступ к данным в фрейме или фрейме с помощью плагина IE Browser Helper Object (BHO) - PullRequest
2 голосов
/ 18 августа 2010

Я пишу плагин IE, который упаковывает телефонные номера в ссылку, которая подключается к телефонной системе и набирает этот номер при нажатии.Я выполняю это с помощью события DocumentComplete.

//using SHDocVw.WebBrowser
webBrowser.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);

Проблема в том, что я не могу получить доступ к элементам внутри элементов frame и iframe.

Вопрос: Как вы манипулируете даннымивнутри элементов frame и iframe в IE с помощью объекта Browser Helper?

Ответы [ 3 ]

5 голосов
/ 30 августа 2010

Сначала несколько предостережений.Вообще говоря, надстройки такого типа (например, те, которые запускаются на всех страницах и сканируют весь контент) оказывают существенное влияние на производительность и могут привести к тому, что пользователи удалят или отключают надстройку, когда видят влияние на производительность, которое оно вызывает.Кроме того, кажется, что вы пишете свой код в .NET, что также настоятельно не рекомендуется из-за влияния на производительность.

Получение содержимого междоменного подкадра нетривиально, потому что вы получите AccessЗапрещено по умолчанию.Причина в том, что междоменное ограничение безопасности, которое существует для JavaScript, также применяется, когда ваша надстройка пытается получить междоменное содержимое.

Чтобы получить междоменное содержимое со страницы верхнего уровня, вы должны перепрыгнуть через некоторые нетипичные обручи, особенно в .NET.Лучше всего просто запустить код в событии DocumentComplete каждого фрейма, как заметил Джефф.

Если вам нужно выполнить код только один раз, со страницы верхнего уровня, то вы можете сделать это с помощью такой техники, каквот этот:

http://support.microsoft.com/default.aspx?scid=kb;en-us;196340

// &lpDocDisp is the dispatch pointer for the document
IHTMLDocument2* pDocument;
HRESULT hr = lpDocDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDocument);
if (FAILED(hr))
    return hr;

long iCount = 0;

// Now, check for subframes
// http://support.microsoft.com/default.aspx?scid=kb;en-us;196340
IOleContainer* pContainer;

// Get the container
hr = lpDocDisp->QueryInterface(IID_IOleContainer, (void**)&pContainer);
if (FAILED(hr) || (NULL == pContainer)){
    OutputDebugString("[AXHUNTER] Failed to get container\n");
    return hr;
}

LPENUMUNKNOWN  pEnumerator;

// Get an enumerator for the frames
hr = pContainer->EnumObjects(OLECONTF_EMBEDDINGS, &pEnumerator);
pContainer->Release();

if (FAILED(hr) || (NULL == pEnumerator)){
    OutputDebugString("[AXHUNTER] Failed to get enumerator\n");                 
    return hr;
}

IUnknown* pUnk;
ULONG uFetched;

// Enumerate all the frames
for (UINT i = 0; S_OK == pEnumerator->Next(1, &pUnk, &uFetched); i++)
{
    assert(NULL != pUnk);
    IWebBrowser2* pBrowser;
    hr = pUnk->QueryInterface(IID_IWebBrowser2, (void**)&pBrowser);
    pUnk->Release();

    if (SUCCEEDED(hr))
    {
        LPDISPATCH pSubDoc = NULL;
        hr = pBrowser->get_Document(&pSubDoc);
        if (SUCCEEDED(hr) && (NULL != pSubDoc)){
            CrawlPage(pSubDoc, ++iNested);
            pSubDoc->Release();
        }

        pBrowser->Release();
    }
    else
    {
        OutputDebugString("[AXHUNTER] Cannot get IWebBrowser2 interface\n");
    }
}


pEnumerator->Release();
1 голос
/ 18 августа 2010

Вы не можете пройти внутрь фрейма, но DWebBrowserEvents2 должен запустить событие завершения документа для каждого фрейма.Вы просто должны отслеживать их всех.Не уверен, как это переводится в управляемый код.

В зависимости от ваших требований было бы намного проще просто написать Accelerator .Они только для IE8 +, однако ...

0 голосов
/ 18 августа 2010

единственный способ, с помощью которого я могу думать при манипулировании данными в iframe, это дать ему строку запроса, или вы можете сделать что-то вроде обратной передачи (возможно, асинхронно?).Как извлечь данные из этого iframe будет таким же образом.Что касается фреймов, то, насколько мне известно, они устарели, поэтому я бы порекомендовал изучить их изменение.

...