動態更改WebBrowser資料流內容 (動態修改網頁原始碼)
有時,由於軟體的特殊需要,我們希望DELPHI在WebBrowser或embeddedwb裡動態更改返回的資料內容,而這需要返回網頁的所有原始原始碼,包括網頁開始的DOCTYPE html PUBLIC宣告部分,僅僅使用mshtml是無法實現的,需要用到資料流的方法。
具體執行方法如下(需要 uses mshtml,activex):
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
ms: TMemoryStream;
StrStream:TStringStream;
begin
//先讀取到流中,暫存於memo1
if not Assigned(embeddedwb1.Document) then Exit;
ms := TMemoryStream.Create;
(embeddedwb1.Document as IPersistStreamInit).Save(TStreamAdapter.Create(ms), True);
ms.Position := 0;
Memo1.Lines.LoadFromStream(ms);
ms.Free;
//再從流中取出資料輸出
s := memo1.text;
//執行替換部分程式碼
s:=StringReplace(s,'_blank','_self',[rfReplaceAll,rfIgnoreCase]);
StrStream:=TStringStream.Create(s);
try
StrStream.Position:=0;
(embeddedwb1.Document as IPersistStreamInit).Load(TStreamadapter.Create(StrStream));
finally
StrStream.Free;
end;
end;
通過以上轉換,可以實現無損式的動態修改網頁原始碼,保證css格式。
但存在一個問題,比如原始的網頁的uri為 http://www.piaoyi.org,經過上面的資料流處理後,網頁的url變成了 about:blank ,這就使得網頁裡採用相對路徑的檔案,如 images/piaoyi.gif 的路徑發生了錯誤,即變成了 about:blankimages/piaoyi.gif ,明顯這是路徑錯誤。解決的方法,就是替換所有相對路徑為絕對路徑。方法就是再html程式碼前加上這麼一句:<base href="http://www.piaoyi.org">
另外,還有一種方法可以動態的寫入原始碼到 webbrowser 或 embeddedwb 裡,如下:
procedure TForm11.Button1Click(Sender: TObject);
var
v:OleVariant;
HTMLDocument:ihtmldocument2;
begin
HTMLDocument := EmbeddedWB1.Document as IHTMLDocument2;
v := VarArrayCreate([0, 0], varVariant);
v[0] := '這裡寫入html程式碼';
HTMLDocument.Write(PSafeArray(TVarData(v).VArray));
HTMLDocument.Close;
end;