2016-11-18 109 views
1

我需要從我在Delphi XE10(VCL)的TWebBrowser組件中顯示的網站中刪除一個小圖像。我花了幾個小時的搜索,我嘗試了很多代碼,但它不能按我的需要工作。從TWebBrowser中的活動html中刪除特定的IMG標記

這是我的代碼片段:

procedure TForm16.WebBrowser1DocumentComplete(ASender: TObject; 
    const pDisp: IDispatch; const [Ref] URL: OleVariant); 
var 
    Doc: IHTMLDocument2; 
    ElementCollection: IHTMLElementCollection; 
    Frames: IHTMLElementCollection; 
    Element: IHTMLElement; 
    Frame: IHTMLDOMNode; 
    i: Integer; 
begin 
    Doc := WebBrowser1.Document as IHTMLDocument2; 
    ElementCollection := Doc.body.all as IHTMLElementCollection; 
    Frames := ElementCollection.tags('IMG') as IHTMLElementCollection; 
    if Frames <> nil then 
    begin 
    for i := 0 to Frames.length - 1 do 
    begin 
     Element := Frames.item(i, 0) as IHTMLElement; 
     Frame := Element as IHTMLDOMNode; 
     if Frame <> nil then 
     begin 
     Frame.parentNode.removeChild(Frame); 
     end; 
    end; 
    end; 

end; 

不幸的是它會刪除所有圖像。我想刪除具有特定HREF的特定圖片。你能幫助我嗎?

+0

你將它們全部遍歷並全部刪除。爲什麼要這樣做,如果你只想刪除其中的一個。 –

+0

感謝您的回覆。 –

+0

我不想循環它們,以便我可以刪除具有href ='exp.com/exp.png'的img節點,但我不知道如何實現它 –

回答

1

我不確定您是否在srchref屬性之後。
我假設你實際上是指src(我不知道href使用IMG標籤)。如果不是,請在下面的答案中將src替換爲href

基本上你的代碼很好。您可以檢查IHTMLElement屬性,例如

if Element.getAttribute('src', 0) = 'something' then ... 

我建議使用IHTMLDocument2.images收集直接和IHTMLImgElement它具有src/href性能,如:

procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; 
    const pDisp: IDispatch; var URL: OleVariant); 
var 
    Doc: IHTMLDocument2; 
    Images: IHTMLElementCollection; 
    Img: IHTMLImgElement; 
    Node: IHTMLDOMNode; 
    Src: WideString; 
    I: Integer; 
begin 
    Doc := TWebBrowser(Sender).Document as IHTMLDocument2; 
    if Assigned(Doc) then 
    begin 
    Images := Doc.images; 
    for I := Images.length - 1 downto 0 do 
    begin 
     Img := Images.item(I, 0) as IHTMLImgElement; 
     if Img.src = 'http://foo.bar/my.png' then // or "Img.href" 
     begin 
     Node := Img as IHTMLDOMNode; 
     Node.parentNode.removeChild(Node); 
     Break; // optional 
     end; 
    end; 
    end; 
end; 

請注意,我遍歷DOM向後

for I := Images.length - 1 downto 0 do 

,因爲如果我們需要刪除多個節點,刪除前一個節點後,我們不會放棄下一個節點索引。