AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ExecuteScript

Ein Thema von Andi_j62 · begonnen am 13. Okt 2007 · letzter Beitrag vom 10. Feb 2008
Antwort Antwort
Seite 1 von 2  1 2      
Andi_j62

Registriert seit: 20. Okt 2003
Ort: Kempten
46 Beiträge
 
Delphi 7 Professional
 
#1

ExecuteScript

  Alt 13. Okt 2007, 01:47
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: ExecuteScript

  Alt 14. Okt 2007, 09:36
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
  Mit Zitat antworten Zitat
Andi_j62

Registriert seit: 20. Okt 2003
Ort: Kempten
46 Beiträge
 
Delphi 7 Professional
 
#3

Re: ExecuteScript

  Alt 14. Okt 2007, 13:29
hallo marabu,

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

Grüße Andi
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#4

Re: ExecuteScript

  Alt 14. Okt 2007, 15:56
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++)
Thomas
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: ExecuteScript

  Alt 17. Okt 2007, 16:17
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
  Mit Zitat antworten Zitat
API

Registriert seit: 18. Apr 2004
637 Beiträge
 
#6

Re: ExecuteScript

  Alt 4. Feb 2008, 10:16
Ich möchte eine JS-Funktion ausführen, sobald sie verfügbar ist.

D.h 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 ?)
  Mit Zitat antworten Zitat
API

Registriert seit: 18. Apr 2004
637 Beiträge
 
#7

Re: ExecuteScript

  Alt 9. Feb 2008, 13:29
*PUSH*
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: ExecuteScript

  Alt 10. Feb 2008, 09:10
Moin,

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

Grüße vom marabu
  Mit Zitat antworten Zitat
API

Registriert seit: 18. Apr 2004
637 Beiträge
 
#9

Re: ExecuteScript

  Alt 10. Feb 2008, 09:18
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

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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: ExecuteScript

  Alt 10. Feb 2008, 14:05
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz