本文示例源代碼或素材下載
TWebBrowser平時用得比較多,也收集過大量雜亂無章的技巧。不過東西太多太雜,每到用的時又要重新拼湊一番,實在是太累。於是早就有寫一組WebBrowser例程,打算把常用的一些類似代碼整理一下,以便查用。附帶完整工程,見文章末尾。
這是第一篇,關於插入Html和執行腳本的方法。程序界面如圖,
先看代碼:
關鍵代碼{ 在 WebBrowser 內執行腳本
用法:
Memo1.Lines.add('alert("Hello World!");');
ExecuteScript(WebBrowser1, Memo1.Lines, 'Javascript'); }
procedure TfrmSavePages.ExecuteScript(aWebBrowser: TWebBrowser; lScript: TStrings; language: String = 'Javascript');
var
HTDoc: IHtmlDocument2;
begin
HTDoc := (aWebBrowser.Document as IHtmlDocument2);
if (HTDoc <> nil) then
begin
if HTDoc.parentWindow <> nil then
HTDoc.parentWindow.ExecScript(lScript.Text, Olevariant(language)) ;
end;
end;
{ 向目標頁面加入Html
用法:
Memo1.Lines.add('<div>AppendToWB()演示</div>');
AppendToWB(WebBrowser1, Memo1.Lines); }
procedure AppendToWB(aWebBrowser: TWebBrowser; lHtml: TStrings) ;
var
HTDoc: IHtmlDocument2;
Range: IHtmlTxtRange;
begin
HTDoc := (aWebBrowser.Document as IHtmlDocument2);
if (HTDoc <> nil) then
begin
Range := (HTDoc.body AS IHtmlBodyElement).createTextRange;
Range.Collapse(False);
Range.PasteHTML(lHtml.Text);
end;
end;
{ 另一種加入Html內容的方法,和之前插入方式不同,這個可以執行腳本
用法:WBLoadHtml(WebBrowser1, Memo1.Lines);}
procedure WBLoaDHtml(WebBrowser: TWebBrowser; lHtml: TStrings);
var
ms: TMemoryStream;
begin
// 轉到一個空頁面
WebBrowser.Navigate('about:blank');
while WebBrowser.ReadyState < READYSTATE_INTERACTIVE do
Application.ProcessMessages;
if Assigned(WebBrowser.Document) then
begin
ms := TMemoryStream.Create;
try
// 將頁面內容寫入內存流
lHtml.SaveToStream(ms);
ms.Seek(0, soFromBeginning);
(WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms));
finally
ms.Free;
end;
end;
end;
總結了一下,在已經載入的頁面中執行腳本,最短的代碼就是上面貼的這個了:
ExecuteScript(WebBrowser1, Memo1.Lines, 'Javascript');
將要執行的腳本內容讀取到Memo1中,然後調用這個就可以了。後面的 Javascript 也可以換成 vbscript。
關於兩個寫入HTML,第一個 AppendToWB() 方法雖然簡單,但是不能執行腳本。而 WBLoaDHtml() 通過IPersistStreamInit接口寫入Html數據,相當於重載頁面,所以附加<script>標簽也是可行的,推薦使用。具體區別下載完整工程感受下吧。