2012-03-27 5 views
4

Использование CEF Browser Я пытаюсь подключиться к событию OnLoadEnd, чтобы пересечь дерево DOM.OnLoadEnd вызвал несколько раз из Chromum Embedded Framework

По какой-то странной причине я получаю VisitDom, называемый 2 раза.

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    FBrowser := TChromium.Create(Self); 
    FBrowser.Parent := TWinControl(Self); 
    FBrowser.OnLoadEnd := BrowserOnLoadEnd; 
    FBrowser.Load('http://google.com'); 
end; 

procedure VisitDom(const Document: ICefDomDocument); 
begin 
    ShowMessage(Document.Document.Name); 
end; 

procedure TForm1.BrowserOnLoadEnd(Sender: TObject; 
    const Browser: ICefBrowser; const Frame: ICefFrame; HttpStatusCode: Integer; 
    out Result: Boolean); 
var 
    Visitor: TCefFastDomVisitor; 
begin 
    if HttpStatusCode = 200 then 
    begin 
    Visitor := TCefFastDomVisitor.Create(VisitDom); 
    FBrowser.Browser.MainFrame.VisitDom(Visitor); 
    end; 
end; 

Любая идея, почему OnLoadEnd вызывается несколько раз?

+1

Могу ли я спросить, как вы пришли к выводу, что «BrowserOnLoadEnd» вызывается дважды? вы поставили точку останова на «begin» или? Я не использовал CEF, но у меня странное ощущение, что этот «FBrowser.Browser.MainFrame.VisitDom» является генератором «двойного» события. – ComputerSaysNo

+0

P.S. Я также вижу «выход из результата: логический», вы не должны убедиться, что (результат = True)? опять же, я прошу не уверен. – ComputerSaysNo

+0

Просто интересно: почему вы устанавливаете производный класс TForm1 TWinControl в TWinControl при настройке родителя браузера? Это не правда. (например, TWinControl (Self); –

ответ

5

Похоже, OnLoadEnd вызывается с HttpStatusCode = 200 для каждого актива страницы имеющей такие как: изображения, внешние скрипты и т.д.

Решение состоит в том, чтобы проверить на основную раму загружается - Frame.IsMain = True ,

if (HttpStatusCode = 200) and Frame.IsMain then 
begin 
    Visitor := TCefFastDomVisitor.Create(VisitDom); 
    FBrowser.Browser.MainFrame.VisitDom(Visitor); 
end; 
+0

Или .. if (HttpStatusCode! = 0) и Frame.IsMain then –