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>标签也是可行的,推荐使用。具体区别下载完整工程感受下吧。
源码(Source):WB_ControlJS_src.rar 编译好的工程文件:WB_ControlJS_bin.rar
转载于:https://www.cnblogs.com/bits/archive/2009/03/08/Delphi-WebBrowser_Control_htmljs.html
相关资源:各显卡算力对照表!