2016-11-18 4 views
1

Мне нужно удалить небольшое изображение с веб-сайта, который я показываю в своем компоненте TWebBrowser в Delphi XE10 (VCL). Я трачу часы на поиск, и я пробовал много кода, но он не работает, как я хочу.Удалите определенный тег IMG из активного html в 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. ты можешь помочь мне с этим?

+0

Вы перебираете их все и удаляете их все. Зачем это нужно, если вы хотите удалить только один из них. –

+0

благодарю вас за ответ. –

+0

Я не собираюсь зацикливать их на всех, чтобы я мог удалить узел img, который имеет href = 'exp.com/exp.png', но я не знаю, как я могу его достичь. –

ответ

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 

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