AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke TWebbrowser and Javascript

TWebbrowser and Javascript

Ein Thema von wschrabi · begonnen am 20. Dez 2016 · letzter Beitrag vom 20. Dez 2016
Antwort Antwort
wschrabi

Registriert seit: 16. Jan 2005
321 Beiträge
 
#1

TWebbrowser and Javascript

  Alt 20. Dez 2016, 11:03
Hallo Leute,
FRAGE: Ich lade eine Website mit TWebbrowser in Delphi XE6. In dieser Website werden nach dem Laden Javascript Functionen ausgeführt.
Jetzt hat er nach dem Documentscomplete Aufruf, die JS änderungen in der Site noch nicht fertig gemacht. Dh Wenn ich jetze die Seite parse, sind die Werte noch nicht in den HTML Text drin.
Wie kann ich TWebbrowser veranlassen, dass er erst DocumentsComplete ausführt, wenn Javascript die Sache beendet hat.

Zur Zeit lade ich die Site max 8 mal in der Hoffnung, dass es manchmal schneller geht und die Werte in der Seite drin sind. Das klappt auch doch sind viele unnötige Ladezyclen nötig.

Weiß wer Rat?
DANKE HERZLICH

Walter

PS: hab das hier gefunden: http://forums.codeguru.com/showthrea...age-to-process Wie ich das recht verstehe, soll man ein ShowModal Window nach dem das Document geloaded wurde öffnen und dies timergesteuert nach ca 5 sec wieder schließen. Taugt das was?

Geändert von wschrabi (20. Dez 2016 um 11:19 Uhr)
  Mit Zitat antworten Zitat
win568

Registriert seit: 8. Sep 2008
102 Beiträge
 
#2

AW: TWebbrowser and Javascript

  Alt 20. Dez 2016, 12:04
Hi

Wenn du den EmbeddedWB verwendest, kannst du per Doc2.scripts.length abfragen, wieviele Scripte geladen wurden bzw.
mit folgendem Code warten, bis alle geladen sind:

procedure WaitForScriptLoaded;
var
lComplete: Boolean;
lScript: IHTMLScriptElement;
begin
// Warte bis die Scripts geladen wurden
lComplete := FALSE;
while not lComplete do begin
Forms.Application.ProcessMessages;
if Doc2.scripts.length >= 1 then begin
lScript := Doc2.scripts.Item(0,0) as IHTMLScriptElement;
if (lScript.readyState = 'complete') or
(lScript.readyState = 'loaded') then begin
lComplete := True;
end;
end;
Sleep(100);
end;
end;

Wenn du keinen EmbeddedWB hast, musst du erst das Document ermitteln.
Die Abfrage kannst du um OnDocumentComplete machen. Hier solltest du folgendes machen:

procedure Form.DoOnEWBDocumentComplete(ASender: TObject; const pDisp: IDispatch;
var URL: OleVariant);
var
lCurWebbrowser: IWebBrowser;
lTopWebbrowser: IWebBrowser;
begin
try
// Wurde das Document auch wirklich vollständig geladen ??
// DocumentComplete wird auch für die eingebetteten Frames aufgerufen !!!
lCurWebbrowser := pDisp as IWebBrowser;
lTopWebBrowser := (ASender as TWB).DefaultInterface;
// Erst wenn das Dokument komplett geladen wurde, dann
// dürfen die Aktionen durchgeführt werden
if (lCurWebbrowser = lTopWebBrowser) and
(FWB.ReadyState = READYSTATE_COMPLETE) then begin

-> Hier kannst du dann warten
  Mit Zitat antworten Zitat
wschrabi

Registriert seit: 16. Jan 2005
321 Beiträge
 
#3

AW: TWebbrowser and Javascript

  Alt 20. Dez 2016, 17:28
DANKE, ich habe keinen EMbeddedWB
BESTEN DANK AUCH FÜR DEIN SCRIPT.
Werde estesten.

Blöde Frage (sorry): Was ist FWB? Woher die Methode ReadyState?

Zitat:
if (lCurWebbrowser = lTopWebBrowser) and
(FWB.ReadyState = READYSTATE_COMPLETE) then begin
BLöde Frage: Was ist ein Embedded WB? Ich kenne nur TWebbrowser in Delphi . Danke für die Aufklärung.

Ich hab das mit dem LADEN so gelöst: (fast gleich)
Delphi-Quellcode:
procedure TForm1.WebBrowser1DocumentCompleteFULL(ASender: TObject;
  const pDisp: IDispatch; const URL: OleVariant);
var
  CurWebrowser: IWebBrowser;
  TopWebBrowser: IWebBrowser;
  Document: OleVariant;
  WindowName: string;
begin
  CurWebrowser := pDisp as IWebBrowser;
  TopWebBrowser := (ASender as TWebBrowser).DefaultInterface;
  if (CurWebrowser = TopWebBrowser) then
    begin
    WebBrowser1DocumentComplete(ASender, pDisp, URL);
    end
  else
  begin
    Document := CurWebrowser.Document;
    WindowName := Document.ParentWindow.Name;
    //ShowMessage(Format('Frame "%s" was loaded', [WindowName]));
  end;
end;
und in WebBrowser1DocumentComplete(ASender, pDisp, URL); arbeite ich die SEite.
Doch da ist JS noch nicht abgearbeitet. Daher meine Frage was mit dem
Zitat:
(FWB.ReadyState = READYSTATE_COMPLETE)
ist.
Wartet er da bis die JS gemacht ist? WOher diese Bool Variable?


Nochwas: Dacht mit sleep(1000) wir alles gewartet auch das Abarbeiten der JS in der Seite. Stimmt das nicht, steht hier:
Zitat:
I had the same problem, and the solution I found is:
this inside it's own form, all it is is a window with text of "Please wait a moment", and because it's showdialog() you freeze all input and code within the thread, but you don't hold up the thread to prevent the loading of the post processed data after documentcompleted is fired.
mfg
Walter

Geändert von wschrabi (20. Dez 2016 um 17:42 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 02:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf