从TWebBrowser中的活动html中删除特定的IMG标记

时间:2016-11-18 23:38:35

标签: delphi dom twebbrowser

我需要从我在Delphi XE10(VCL)的TWebBrowser组件中显示的网站中删除一个小图像。我花了几个小时的搜索,我尝试了很多代码,但它没有按照我的意愿工作。

这是我的代码片段:

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的特定图像。你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分: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

因为如果我们需要删除多个节点,我们在删除前一节点后就不会松开下一个节点索引。