本站首页    管理页面    写新日志    退出


«Mar.2026»
1234567
891011121314
15161718192021
22232425262728
293031


公告
================

注会练习软件
http://www.cpasoft.com.cn
我的注会软件官网

http://blog.163.com/abc7105@126/

 

 


哈哈,热爱快“过气”的DELPHI


我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:注册会计师(注会)练习软件
日志总数:398
评论数量:116
留言数量:27
访问次数:3297982
建立时间:2005年6月6日




[delpih编程]Webbrowser 技巧集(转贴)
软件技术

吕向阳 发表于 2009/3/12 12:12:11

1.获得网页中变量值 htm中 程序中可以这么调用 id := Form1.WebBrowser1.OleObject.Document.script.currID 值得说明的是,变量可以是javascript定义的,也可以是vbscript定义的,如果Webbrowser1中找不到该变量,调用会触发一个异常事件,即变量currID不存在。---------------------------------------------------------------------------2.执行网页中的函数 tmp := 'currID = getNextID(currID)'+#13#10;Form1.WebBrowser1.OleObject.Document.parentWindow.execScript(tmp,'JavaScript'); 调用函数的方法就是execScript接口,同样,如果函数不存在,或者运行错误也会触发脚本错误异常---------------------------------------------------------------------------3.设置网页背景 背景图片 WebBrowser1.OleObject.Document.body.background := 'http://seelearn.com/bg.gif' 背景颜色 WebBrowser1.OleObject.Document.body.bgcolor := '#eeeeee'---------------------------------------------------------------------------4.调用网页中已知对象 src := WebBrowser1.OleObject.Document.getElementByID('img1').src 该方法其实就是javascript中的 getElementByID --------------------------------------------------------------------------- 5.获取页面中所有的frame 使用DHTML。frames:=wb.OleObject.document.frames;for i:=0 to frames.length domemo1.lines.Add(frames[i].document.body.innerHTML);---------------------------------------------------------------------------6.BorderStyle=bsNone后Webbrowser会被重新初始化,这是一个让人很意外的一个问题,Delphi在窗口控件的控制方面做得非常好,很少出现这种BUG。根据分析,出现这个现象有很多情况 改变FormStyle也会出现 ; 如果 webbrowser.parent 由panel1 改到panel2.也会导致webbrowser重新初始化。---------------------------------------------------------------------------7.直接向Webbrowser中写入html代码,不需要Navigate到实际存在的文件 varStrStream:TStringStream;SetNoteStr: string; begin SetNoteStr :='align=center> 点点博客 http://seelearn.com';SetNoteStr :=SetNoteStr+' 点击左边按钮可查看对应图片';StrStream:=TStringStream.Create(SetNoteStr);WebBrowser1.Navigate('about:blank');tryStrStream.Position:=0;( WebBrowser1.Document as IPersistStreamInit).Load(TStreamadapter.Create(StrStream));finallyStrStream.Free;end;---------------------------------------------------------------------------8.前进,后退,刷新 self.WebBrowser1.GoBack self.WebBrowser1.GoForward self.WebBrowser1.Refresh---------------------------------------------------------------------------9.捕捉NewWindow2事件,即新开窗口事件 procedure TForm1.WebBrowser1NewWindow2(Sender: TObject;var ppDisp: IDispatch; var Cancel: WordBool);var NewWindow: TForm2;begin//exit;NewWindow:= TForm2.Create(nil);NewWindow.Show;ppDisp:= NewWindow.Webbrowser1.DefaultDispatch;end; 值得一题的是该方法不能获得新开窗口的URL,退一步的方法只能是等到在新的Webbrowser中触发BeforeNavigate2事件判断了---------------------------------------------------------------------------10.网页中存在iframe时判断页面是否下载结束 procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;const pDisp: IDispatch; var URL: OleVariant);begin if WebBrowser1.Application = pDisp then showmessage('页面已全部下载完毕')end; 说明一下,每个iframe下载完毕都会触发DocumentComplete事件,所以一个页面在真正下载完毕前可能被触发多次11. 获取网页中图片//使用DOM模型,什么都能读下来 uses MSHtml, ActiveX; var html_doc: IHTMLDocument2; doc_all: IHtmlElementCollection; vI : IHtmlImgElement; begin html_doc := WebBrowser1.Document as IHTMLDocument2; doc_all := html_doc.images; for I := 0 to doc_all.length - 1 do begin vI := doc_all.item(I, EMPTYPARAM) as IHtmlImgElement; //读取vI.src Memo1.Lines.Add(vI.src); end; end;12. 下面函数获得ISomeControl接口var html_doc: IHTMLDocument2; doc_all: IHtmlElementCollection; vI : IHtmlElement; vD : IDispatch; begin html_doc := WebBrowser1.Document as IHTMLDocument2; doc_all := html_doc.all; for I := 0 to doc_all.length - 1 do begin vI := doc_all.item(I, EMPTYPARAM) as IHtmlElement; if vI.tagName='OBJECT' then begin //读取Classid Memo1.Lines.Add((vI as IHtmlObjectElement).classid); //读取包容的对象接口 vD := (vI as IHtmlObjectElement).object_; ... end; end; end;——————————————————————————————————————————Twebbrowser里如何保存里面的网页内容?WebBrowser1.ExecWB(OLECMDID_SAVEAS,OLECMDEXECOPT_DODEFAULT, EmptyParam,EmptyParam);---------------------------------------------------------------------------直接从TWebBrowser得到网页源码及Html  下面先介绍一种极其简单的得到TWebBrowser正在访问的网页源码的方法。一般方法是利用TWebBrowser控件中的Document对象提供的IPersistStreamInit接口来实现,具体就是:先检查WebBrowser.Document对象是否有效,无效则退出;然后取得IPersistStreamInit接口,接着取得HTML源码的大小,分配全局堆内存块,建立流,再将HTML文本写到流中。程序虽然不算复杂,但是有更简单的方法,所以实现代码不再给出。其实基本上所有IE的功能TWebBrowser都应该有较为简单的方法来实现,获取网页源码也是一样。下面的代码将网页源码显示在Memo1中。   Memo1.Lines.Add(IHtmlDocument2(WebBrowser1.Document).Body.OuterHtml);  同时,在用TWebBrowser浏览HTML文件的时候要将其保存为文本文件就很简单了,不需要任何的语法解析工具,因为TWebBrowser也完成了,如下:   Memo1.Lines.Add(IHtmlDocument2(WebBrowser1.Document).Body.OuterText);---------------------------------------------------------------------------提取网页中所有链接  这个方法来自大富翁论坛hopfield朋友的对一个问题的回答,我本想自己试验,但总是没成功。  var   doc:IHTMLDocument2;   all:IHTMLElementCollection;   len,i:integer;   item:OleVariant;  begin   doc:=WebBrowser1 .Document as IHTMLDocument2;   all:=doc.Get_links;             //doc.Links亦可   len:=all.length;   for i:=0 to len-1 do begin    item:=all.item(i,varempty);        //EmpryParam亦可    memo1.lines.add(item.href);   end;  end;---------------------------------------------------------------------------在WebBrowser加载html页面完成后,在页面顶端插入HTML代码, 下面两种方式斗可以. {1. ----------------------------------------------------------------} procedure TForm1.Button1Click(Sender: TObject); var Range: IHTMLTxtRange; begin Range := ((WebBrowser1.Document as IHTMLDocument2).body as IHTMLBodyElement).createTextRange; Range.collapse(False); Range.pasteHTML(’Hello!’); end; {2. ----------------------------------------------------------------} procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); var WebDoc: HTMLDocument; WebBody: HTMLBody; begin WebDoc := WebBrowser1.Document as HTMLDocument; WebBody := WebDoc.body as HTMLBody; WebBody.insertAdjacentHTML(’BeforeEnd’, ’ Hello World!’); end; ---------------------------------------------------------------------------如何将页面中超链接新开的页面窗口包到指定的VCL窗口中. procedure TForm1.webNewWindow2(Sender: TObject; var ppDisp: IDispatch; var Cancel: WordBool); var form : TForm1; begin form := TForm1.Create(nil); ppDisp := form.web.DefaultDispatch; form.Show; end; ---------------------------------------------------------------------------打开某个页面: web.Navigate(ExtractFilePath(Application.ExeName) + ’Template/login.html’);


阅读全文(1342) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 1.773 second(s), page refreshed 144811369 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号