![]() |
ExecuteScript
Hallo Zusammen,
ich führe mit execScript ein Javascript aus. Wer weiss wie ich in Delphi eine Variable auslesen kann, die ich im Javascript definiert habe? Viele Grüße Andi |
Re: ExecuteScript
Hallo Andi,
laut Dokumentation behandelt execScript() jede JS function wie eine procedure - ein Rückgabewert wird grundsätzlich verworfen. Du kannst also keine JS function schreiben, die dir den Zugriff auf eine Variable gewährt. Allen Bauer zeigt in seinem ![]() Grüße vom marabu |
Re: ExecuteScript
hallo marabu,
danke dür Deinen Hinweis. Werde mal sehen ob ich weiterkomme. Grüße Andi |
Re: ExecuteScript
Hallo
Du kannst die J-Script Funktion via IDispatch.Invoke ausführen und zuvor die Skript ID per IDispatch.GetIDsOfNames ermitteln. Dann kann man die Rückgabewerte auslesen. Referenz msdn: ![]() ![]() |
Re: ExecuteScript
Hallo Thomas,
danke für diesen Tipp - diesen Weg habe ich irgendwie völlig übersehen:
Delphi-Quellcode:
Freundliche Grüße
unit DemoFrm;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, OleCtrls, SHDocVw; type TDemoForm = class(TForm) WebBrowser: TWebBrowser; Panel: TPanel; Button: TButton; procedure FormCreate(Sender: TObject); procedure ButtonClick(Sender: TObject); end; var DemoForm: TDemoForm; implementation {$R *.dfm} uses ActiveX, MSHTML; resourcestring HTML = '<HTML> <HEAD> <TITLE>Evaluate</TITLE> ' + '<SCRIPT> function evaluate(x) {' + ' alert("hello");' + ' return eval(42);' + '} </SCRIPT> </HEAD> <BODY> TEST </BODY> </HTML>' ; procedure LoadDocument(doc: OleVariant; s: string); begin doc.Clear; doc.Write(s); doc.Close; end; procedure TDemoForm.FormCreate(Sender: TObject); begin WebBrowser.Navigate('about:blank'); LoadDocument(WebBrowser.Document, HTML); end; procedure TDemoForm.ButtonClick(Sender: TObject); var doc: IHTMLDocument2; dScript: IDispatch; vResult: OleVariant; wsMethod: WideString; id: TDispId; hr: HRESULT; params: TDispParams; begin FillChar(params, SizeOf(params), 0); doc := WebBrowser.Document as IHTMLDocument2; if Assigned(doc) then begin dScript := doc.Script; if Assigned(dScript) then begin wsMethod := 'evaluate'; if Succeeded(dScript.GetIDsOfNames(GUID_NULL, @wsMethod, 1, 0, @id)) then begin dScript.Invoke(id, GUID_NULL, 0, DISPATCH_METHOD, params, @vResult, nil, nil); ShowMessage(IntToStr(vResult)); end; end; end; end; end. |
Re: ExecuteScript
Ich möchte eine JS-Funktion ausführen, sobald sie verfügbar ist.
D.h
Delphi-Quellcode:
gibt True zurück.
if Succeeded(dScript.GetIDsOfNames(GUID_NULL, @wsMethod, 1, 0, @id)) then
Wo am besten soll ich das während des Ladens des Dokuments überprüfen? (Polling oder gibt es ein Event ?) |
Re: ExecuteScript
*PUSH*
|
Re: ExecuteScript
Moin,
natürlich gibt es ein Event: ![]() Grüße vom marabu |
Re: ExecuteScript
Zitat:
Könnte ich im OnProgress
Delphi-Quellcode:
laufen lassen und sobal True zurückgegeben wird kann ich auf die Funktion zugreifen?
if Succeeded(dScript.GetIDsOfNames(GUID_NULL, @wsMethod, 1, 0, @id))
Hintergrund: Ich lade eine Seite und führe darauf eine JS-Funktion aus. Ich möchte falls möglich die Funktion vor OnDocumentComplete ausführen um an Performance zu gewinnen. |
Re: ExecuteScript
Ganz klar: Bevor die JS-Funktion nicht in das Document Object Model eingebaut worden ist, kannst du auf sie nicht zugreifen - das ergibt sich bereits aus meinem Beispiel-Code. Nur mit dem Event OnDocumentComplete bist du auf der sicheren Seite, da auch die JS-Funktion auf DOM-Elemente zugreifen könnte, die ja erst vom Parser analysiert sein müssen. Ob ich schon vor dem OnDocumentComplete auf Teile des DOM zugreifen kann, habe ich nie ausprobiert, aber ich vermute, dass WebBrowser.Document erst aktualisiert wird, wenn das neue DOM vollständig aufgebaut ist.
Eine Beschleunigung könnte ich mir vorstellen, wenn der Browser viele Bilder o.ä. nachlädt: Du könntest ihn anweisen das zu unterlassen. Was sind denn die Eckdaten wie Seitengröße, Übergangszeiten zwischen den ReadyStates, ... ? Geht es um eine ganz spezielle Seite oder suchst du nach einer allgemeinen Lösung? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz