Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi ExecuteScript (https://www.delphipraxis.net/101435-executescript.html)

Andi_j62 13. Okt 2007 00:47


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

marabu 14. Okt 2007 08:36

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 Blog, wie er in einem D2007-Projekt JS per COM auf Delphi zugreifen lässt, aber wir beide arbeiten mit D7. Ich habe das bisher nicht gebraucht, aber ich würde mit D7 folgenden Ansatz verfolgen: Aufruf einer JS function, die den gewünschten Wert in einem hidden field ablegt und anschließend Zugriff auf dieses Element per DOM.

Grüße vom marabu

Andi_j62 14. Okt 2007 12:29

Re: ExecuteScript
 
hallo marabu,

danke dür Deinen Hinweis. Werde mal sehen ob ich weiterkomme.

Grüße Andi

toms 14. Okt 2007 14:56

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: http://support.microsoft.com/kb/q185127/

Beispiel (in c++)

marabu 17. Okt 2007 15:17

Re: ExecuteScript
 
Hallo Thomas,

danke für diesen Tipp - diesen Weg habe ich irgendwie völlig übersehen:

Delphi-Quellcode:
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.
Freundliche Grüße

API 4. Feb 2008 09:16

Re: ExecuteScript
 
Ich möchte eine JS-Funktion ausführen, sobald sie verfügbar ist.

D.h
Delphi-Quellcode:
if Succeeded(dScript.GetIDsOfNames(GUID_NULL, @wsMethod, 1, 0, @id)) then
gibt True zurück.

Wo am besten soll ich das während des Ladens des Dokuments überprüfen? (Polling oder gibt es ein Event ?)

API 9. Feb 2008 12:29

Re: ExecuteScript
 
*PUSH*

marabu 10. Feb 2008 08:10

Re: ExecuteScript
 
Moin,

natürlich gibt es ein Event: Hier im Forum suchenOnDocumentComplete solltest du dir mal anschauen.

Grüße vom marabu

API 10. Feb 2008 08:18

Re: ExecuteScript
 
Zitat:

Zitat von marabu
Moin,

natürlich gibt es ein Event: Hier im Forum suchenOnDocumentComplete solltest du dir mal anschauen.

Grüße vom marabu

Die Funktion könnte doch aber schon vor dem Event verfügbar sein.
Könnte ich im OnProgress

Delphi-Quellcode:
if Succeeded(dScript.GetIDsOfNames(GUID_NULL, @wsMethod, 1, 0, @id))
laufen lassen und sobal True zurückgegeben wird kann ich auf die Funktion zugreifen?


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.

marabu 10. Feb 2008 13:05

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.
Seite 1 von 2  1 2      

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