2012-10-12 88 views
5

我尝试获取所有形式的加载页面的名称。我已经这样做了:Chromium:如何获取所有形式的加载页面

procedure TForm2.Button2Click(Sender: TObject); 
var 
    L: TStringList; 
begin 
    L := TStringList.Create; 

    try 
    Chromium1.Browser.MainFrame.VisitDomProc(
     procedure (const doc: ICefDomDocument) 
     procedure IterateNodes(Node: ICefDomNode); 
     begin 
      if not Assigned(Node) then Exit; 
      repeat 
      if Node.ElementTagName = 'FORM' then 
       L.Add(Node.GetElementAttribute('name')); 

      if Node.HasChildren then IterateNodes(Node.FirstChild); 

      Node := Node.NextSibling; 
      until not Assigned(Node); 
     end; 
     begin 
     IterateNodes(doc.Body); 
     end 
    ); 

    ShowMessage(L.Text); 
    finally 
    FreeAndNil(L); 
    end; 
end; 

但是我没有任何结果。任何想法?

感谢

+1

当你在调试器下面走过时发生了什么? –

+1

你也想使用SameText而不是=,以便比较不区分大小写 –

+0

@David,我认为你的第二个评论是答案... – TLama

回答

3

随着XE2更新4

我已经意识到,程序流在到达ShowMessage仍然无法运行此程序,因此TStringList中是空的运行过程参数,这样,当继续。

我已经把布尔变量控制,它的工作原理,但这不是一个优雅的解决方案。

这里的新代码:

procedure TForm2.Button2Click(Sender: TObject); 
var 
    L: TStringList; 
    Finish: Boolean; 
begin 
    L := TStringList.Create; 
    Finish := False; 

    try 
    Chromium1.Browser.MainFrame.VisitDomProc(
     procedure (const doc: ICefDomDocument) 
     procedure IterateNodes(Node: ICefDomNode); 
     begin 
      if not Assigned(Node) then Exit; 
      repeat 
      if SameText(Node.ElementTagName, 'FORM') then 
      begin 
       L.Add(Node.GetElementAttribute('name')); 
      end; 

      if Node.HasChildren then 
       IterateNodes(Node.FirstChild); 

      Node := Node.NextSibling; 
      until not Assigned(Node); 
     end; 
     begin 
     IterateNodes(doc.Body); 
     Finish := True; 
     end 
    ); 

    repeat Application.ProcessMessages until (Finish); 
    ShowMessage(L.Text); 
    finally 
    FreeAndNil(L); 
    end; 
end; 
+0

我相信你可以等待一些事情,或者在迭代完成时要求回调。 –

+0

我愿意接受建议:-) – cadetill

+0

我对这个控件没有任何经验。文档在哪里? –

1

我设法让整个页面这样的:

  1. 注入DOM元素 - 文本。
ChromiumWB.Browser.MainFrame.ExecuteJavaScript('$("body").prepend(''<input type="text" id="msoftval" value=""/>'')', '', 0); 
  • 使用jQuery或JS以获得体HTML到喷射元件。
  • mResult := ''; 
    ChromiumWB.Browser.MainFrame.ExecuteJavaScript('$("#msoftval").val($("body").html());', '', 0); 
    ChromiumWB.Browser.MainFrame.VisitDomProc(getResult); 
    while mResult = '' do Application.ProcessMessages; 
    Memo1.Text := mResult; 
    
  • 等待直到 'VisitDomProc' finish-使其同步。
  • procedure TForm44.getResult(const doc: ICefDomDocument); 
    var 
        q: ICefDomNode; 
    begin 
        q := doc.GetElementById('msoftval'); 
        if Assigned(q) then 
        mResult := q.GetValue 
        else 
        mResult := '-'; 
    end;