// Способ первый
uses
OleCtrls, SHDocVw, MSHTML;
type
TWebBrowser = class(SHDocVw.TWebBrowser)
procedure RunJS(js: string);
function getElementATTR(tag, id, attr: string): string;
function GetJsParam(Param: string): string;
function GetJsArrayStrList(Param: string): TStringList;
end;
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Button1: TButton;
{...}
end;
implementation
procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser1.RunJS('alert(window.location);');
WebBrowser1.RunJS('alert(document.title);');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate('http://www.decoding.dax.ru/');
end;
{ TWebBrowser }
function TWebBrowser.getElementATTR(tag, id, attr: string): string;
var
Doc: IHTMLDocument2;
Body: IHTMLElement2;
Tags: IHTMLElementCollection;
Tagg: IHTMLElement;
i: Integer;
begin
Result := '';
if not Supports(Self.Document, IHTMLDocument2, Doc) then
raise Exception.Create('Invalid HTML document');
if not Supports(Doc.body, IHTMLElement2, Body) then
raise Exception.Create('Can''t find element');
Tags := Body.getElementsByTagName(UpperCase(tag));
for i := 0 to Pred(Tags.length) do
begin
Tagg := Tags.item(i, EmptyParam) as IHTMLElement;
if Tagg.id = id then
Result := Tagg.getAttribute(attr, 0);
end;
end;
function TWebBrowser.GetJsArrayStrList(Param: string): TStringList;
var
i, k: Integer;
begin
Result := TStringList.Create;
if (GetJsParam('((' + param + '!=null)&&(typeof(' + param +
')==''object'')&&(typeof(' + param + '.length)==''number''))')='true') then
begin
k := StrToInt(GetJsParam(param + '.length'));
for i := 0 to k-1 do
Result.Add(GetJsParam(param + '[' + IntToStr(i) + ']'));
end;
end;
function TWebBrowser.GetJsParam(Param: string): string;
begin
Self.RunJS('var d=document.getElementById(''delphi_result'');' +
'if (!d) {' +
'd=document.createElement(''input'');' +
'd.type=''hidden'';' +
'd.id=''delphi_result'';' +
'document.body.appendChild(d);}' +
'd.value=' + param + ';');
Result := Self.getElementATTR('input', 'delphi_result', 'value');
end;
procedure TWebBrowser.RunJS(js: string);
var
Doc: IHTMLDocument2; // current HTML document
HTMLWindow: IHTMLWindow2; // parent window of current HTML document
begin
Doc:=IHTMLDocument2(Self.Document);
if not Assigned(Doc) then
Exit;
HTMLWindow := Doc.parentWindow;
if not Assigned(HTMLWindow) then
Exit;
try
//JSFn := Format('foo("%s",%d)', [S, I]); // build function call
HTMLwindow.execScript(js, 'Javascript'); // execute function
except
//
end;
end;
// Способ второй
uses
SHDocVw;
procedure TForm2.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate('http://www.decoding.dax.ru/');
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
WebBrowser1.Navigate('javascript: alert(document.title);');
end;
// или немного иначе
uses
SHDocVw;
procedure TForm1.FormCreate(Sender: TObject);
// Содержимое загруженной страницы
//
//
//
//
//
//
//
//
begin
WebBrowser1.Navigate('...');
end;
procedure TForm1.RunJava(const S: string);
var
FName, Flags: OLEVariant;
begin
FName := WideString(S);
Flags := navNoHistory;
WebBrowser1.Navigate(FName, Flags);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
RunJava('javascript:ShowMessage(''ddd'');');
end;
// Способ третий
uses
SHDocVw, MSHTML;
procedure TForm2.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate('http://www.decoding.dax.ru/');
end;
procedure TForm2.Button1Click(Sender: TObject);
var
iDoc: IHtmlDocument2;
begin
WebBrowser1.ControlInterface.Document.QueryInterface(IHTMLDocument2, iDoc);
iDoc.parentWindow.execScript('alert(document.title)', 'JavaScript');
iDoc := nil;
end;
// Способ четвертый
procedure TForm2.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate('http://www.decoding.dax.ru/');
end;
procedure TForm2.Button1Click(Sender: TObject);
var
Doc{, s}: Variant;
begin
// Ссылка на документ.
Doc := WebBrowser1.OleObject.document;
// Проверка - существует ли документ.
if TVarData(Doc).VDispatch = nil then
begin
ShowMessage('Объект документа не создан. Действие отменено.');
Exit;
end;
Doc.parentWindow.alert(Doc.parentWindow.document.title);
Doc := Unassigned;
// Можно вызвать функцию anyFunction(),
// определённую в скрипте на веб-странице.
// s := Doc.parentWindow.getPageStatus();
// ShowMessage(s);
end;
uses
SHDocVw, OleCtrls, ActiveX;
type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
procedure FormCreate(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormDeactivate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
FOleInPlaceActiveObject: IOleInPlaceActiveObject;
SaveMessageHandler: TMessageEvent;
procedure MyMessageHandler(var Msg: TMsg; var Handled: Boolean);
public
end;
implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate('http://decoding.dax.ru');
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Application.OnMessage := SaveMessageHandler;
FOleInPlaceActiveObject := nil;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
SaveMessageHandler := Application.OnMessage;
Application.OnMessage := MyMessageHandler;
end;
procedure TForm1.FormDeactivate(Sender: TObject);
begin
Application.OnMessage := SaveMessageHandler;
end;
procedure TForm1.MyMessageHandler(var Msg: TMsg; var Handled: Boolean);
var
iOIPAO: IOleInPlaceActiveObject;
Dispatch: IDispatch;
begin
{exit if we don't get back a webbrowser object}
if WebBrowser1 = nil then
begin
Handled := False;
Exit;
end;
Handled := IsDialogMessage(WebBrowser1.Handle, Msg) = True;
if Handled and (not WebBrowser1.Busy) then
begin
if FOleInPlaceActiveObject = nil then
begin
Dispatch := WebBrowser1.Application;
if Dispatch <> nil then
begin
Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);
if iOIPAO <> nil then
FOleInPlaceActiveObject := iOIPAO;
end;
end;
if FOleInPlaceActiveObject <> nil then
if ((Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP)) and
((Msg.wParam = VK_BACK) or (Msg.wParam = VK_RETURN)) then
begin
// Здесь обрабатываем нажатие клавиш
end
else
FOleInPlaceActiveObject.TranslateAccelerator(Msg);
end;
end;
// Способ первый
procedure TForm1.WB_HideScrollBar(Hide: Boolean);
begin
if Hide then
begin
WebBrowser1.OleObject.Document.Body.Style.OverflowX := 'hidden';
WebBrowser1.OleObject.Document.Body.Style.OverflowY := 'hidden';
end
else
begin
WebBrowser1.OleObject.Document.Body.Style.OverflowX := '';
WebBrowser1.OleObject.Document.Body.Style.OverflowY := '';
end;
end;
// Способ второй
uses
MSHTML;
procedure TForm1.Button1Click(Sender: TObject);
var
lDocument: IHTMLDocument2;
lBody: IHTMLElement;
lStyle: IHTMLStyle2;
begin
if Assigned(WebBrowser1.Document) and
(Succeeded(WebBrowser1.Document.QueryInterface(IHTMLDocument2, lDocument))) then
begin
lBody := lDocument.Body;
if Assigned(lBody) and Assigned(lBody.style) and
Succeeded(lBody.Style.QueryInterface(IID_IHTMLStyle2, lStyle)) then
begin
lStyle.overflowX := 'hidden'; // Убираем горизонтальный скрол,
// чтобы вернуть, нужно присвоить пустую строку
lStyle.overflowY := 'hidden'; // Убираем вертикальный скрол
// чтобы вернуть, нужно присвоить пустую строку
end;
end;
end;
procedure TForm1.WB_HideBorder(Hide: Boolean);
begin
if Hide then
WebBrowser1.OleObject.Document.Body.Style.borderStyle := 'none'
else
WebBrowser1.OleObject.Document.Body.Style.borderStyle := '';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if WebBrowser1.ReadyState = READYSTATE_COMPLETE then
WebBrowser1.OleObject.Document.ParentWindow.Scrollto(0, WebBrowser1.OleObject.document.body.scrollHeight);
end;
При использовании материала - ссылка на сайт обязательна