手工创建的IHTMLDocument2 怎么无法使用getElementByID() getElementsByName() 等方法呢?(100分)

  • 主题发起人 主题发起人 delhpi
  • 开始时间 开始时间
D

delhpi

Unregistered / Unconfirmed
GUEST, unregistred user!
已经用WININET函数取得目标网页的源码。这里没有用到 webbrower。
var
doc:IHTMLDocument2;
begin
doc:=CoHTMLDocument.Create as IHTMLDocument2;

doc.designMode:='ON';
doc.charset:='UTF-8';
vHTML := VarArrayCreate([0, 0], varVariant);
vHTML[0] :=rs; //这里strs.text是我事先取得的一个页面的代码
doc.Write(PSafeArray(TVarData(vHTML).VArray));
doc.designMode:='OFF';
//接下来我用getElementByID() 等方法时,D提示出错。

doc.colse;
doc:=nil;

[Pascal Error] MainU.pas(628): E2003 Undeclared identifier: 'getElementbyid'
 
没有该方法,给你段代码参考一下

function GetTable(doc: IHTMLDocument2; v: OleVariant; var t: IHTMLTable): Boolean;
var
ec: IHTMLElementCollection;
e2: IHTMLElement2;
begin
Result := True;
e2 := doc.body as IHTMLElement2;
ec := e2.getElementsByTagName('table');
if ec.length > 0
then t := ec.item(v, null) as IHTMLTable
else REsult := False;
end;
 
procedure ShowIt(doc: IHTMLDocument2; s: TStrings);
const
MARKER = 'showit(';
var
i, iLeft, iRight: Integer;
ec: IHTMLElementCollection;
e: IHTMLElement;
value: string;
begin
ec := doc.all.tags('a') as IHTMLElementCollection;
for i := 0 to Pred(ec.length) do
begin
e := ec.item(i, null) as IHTMLElement;
value := e.getAttribute('onclick', 0);
iLeft := Pos(marker, Lowercase(value)) + Length(marker);
iRight := LastDelimiter(')', value);
if iLeft > Length(marker)
then value := Copy(value, iLeft, iRight- iLeft)
else value := '';
s.QuoteChar := '''';
s.DelimitedText := value;
end;
end;
 
好像IHTMLDocument2是没有这个方法。对这方面还很不熟悉。

查询了一下,MSHTML单元
DispHTMLDocument = dispinterface
IHTMLDocument3 = interface(IDispatch)
IHTMLDocument3Disp = dispinterface
这3个 里面 有这个方法。

平时都是看到这样的用法
WebBrowser1.oleobject.document.getElementById

WebBrowser1.Document as IHtmlDocument2

看来,getElementById不是IHtmlDocument2的。

WebBrowser1.Document 即 IHtmlDocument2
WebBrowser1.oleobject.document 对象才有getElementById

奇怪的是输入 WebBrowser1.oleobject. 后 编辑器没有document的提示,但实际上 可以编译通过。

楼上的代码 很好,有参考价值。谢谢。
 
oleobject的方法本来就是没有提示的吧,全靠调试和熟练
WebBrowser有该方法,可惜你是手动创建的I
 
//写法一:

var
Node:Variant;
begin
Node:=WebBrowser1.OleObject.Document.getElementsByTagName('Table');


//写法二:
var
Document:Variant;
Node:Variant;
begin
Document:=WebBrowser1.Document;
Node:=Document.getElementsByTagName('Table');


写法三

uses mshtml;

var
doc:IHTMLDocument3;
nodes:IHTMLElementCollection;
begin
doc:=WebBrowser1.Document as IHTMLDocument3;//呵呵,这儿可不是IHTMLDocument2
nodes:=doc.getElementsByTagName('table');
....

上面前两种是类似脚本的DISPATCH调用,第三种是使用MSHTML接口单元类型定义的写法.
还可以很多种变化,只要你有足够DELPHI的COM知识.

刚才搜索到的。
 
总之你的AS前边得是WebBrowser1.Document
用CoHTMLDocument.Create 是不好使的
 
呵呵,谢谢。我就是想不通过webbrower,直接用wininet取得网页源码,然后用 ihtmldocument2对象获取内容,主要是想可以用getElementsByTagName这些方法。把网页源码当作普通的文本来处理也是可以,不过不是很方便。

下面也是网上搜索到的。看来也有人和我一样,有点概念不清。

doc2 := WBrowser.Document as IHTMLDocument2; //获取页面的文档对象
el := doc2.getElementById('zjgnpanel'); //通过ID获取页面元素


好像doc2是IHTMLDocument2,应该没有getElementById。

呵呵 。




以下是获取页面元素及内容的代码:
//有关页面操作的变量定义全部在MsHtml中,别忘了uses MsHtml
var
doc:IHTMLDocument2;
win:IHTMLWindow2;
Dispatch:IDispatch;
el:IHTMLElement;
begin
doc2 := WBrowser.Document as IHTMLDocument2; //获取页面的文档对象
el := doc2.getElementById('zjgnpanel'); //通过ID获取页面元素

label1Caption := el.innerHTML; //这就是元素所包含的内容
el.innerHTML := '元素的新内容'; //这样就可以设置元素的新内容
 
doc2 := WBrowser.Document as IHTMLDocument2; //获取页面的文档对象
el := doc2.getElementById('zjgnpanel'); //通过ID获取页面元素
我没测试应该是可以的,WBrowser.Document....
 
呵呵,楼上的,既然IHTMLDocument2本身没有这个方法。

无论是怎么得到这个对象的,都不会有getElementById。

我试了一下,确实也不行。
即使是用webbrower 转换而来的。
doc2 := WeBbrowser1.Document as IHTMLDocument2; //获取页面的文档对象
el := doc2.getElementById('zjgnpanel');//[Pascal Error] MainU.pas(563): E2003 Undeclared identifier: 'getElementById'
 
嗯,还得试,呵呵~~~慢慢研究吧
 
后退
顶部