Удалить определенный тег IMG из активного html в TWebBrowser

Мне нужно удалить небольшое изображение с веб-сайта, которое я показываю в моем компоненте TWebBrowser в Delphi XE10 (VCL). Я трачу часы на поиски и перепробовал много кода, но он работает не так, как я хочу.

Это фрагмент моего кода:

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. Можете ли вы помочь мне с этим?


person Ghi Dayz    schedule 18.11.2016    source источник
comment
Вы перебираете их все и удаляете их все. Зачем это делать, если вы хотите удалить только один из них.   -  person David Heffernan    schedule 19.11.2016
comment
Спасибо за ответ .   -  person Ghi Dayz    schedule 19.11.2016
comment
Я не хочу зацикливать их все, чтобы удалить узел img с href='exp.com/exp.png', но я не знаю, как этого добиться.   -  person Ghi Dayz    schedule 19.11.2016
comment
Чтение атрибута href узла   -  person David Heffernan    schedule 19.11.2016


Ответы (1)


Я не уверен, что вам нужен атрибут src или href.
Я предполагаю, что вы на самом деле имели в виду 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

потому что, если нам нужно удалить более одного узла, мы не потеряем индекс следующего узла после удаления предыдущего.

person kobik    schedule 20.11.2016