我需要从我在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的特定图像。你能帮我解决这个问题吗?
答案 0 :(得分: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
因为如果我们需要删除多个节点,我们在删除前一节点后就不会松开下一个节点索引。