Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   TWebBrowser: JavaScript "anstoßen" nach Quelltextänderung (https://www.delphipraxis.net/155569-twebbrowser-javascript-anstossen-nach-quelltextaenderung.html)

Caps 29. Okt 2010 11:18

TWebBrowser: JavaScript "anstoßen" nach Quelltextänderung
 
Einen wunderschönen guten Tag,
ich würde gern einem Quelltext ein bisschen JavaScript hinzufügen (bzw. darin etwas ersetzen), und dann das ganze ausführen.
Genauer:

Folgendes:

Ich verwende einen TWebBrowser auf meiner Form.

- Im Ereignis TForm1.WebBrowser1DocumentComplete lade ich den innerHTML-Quelltext als String in eine Variable:
Code:
HTMLSource := (WebBrowser1.Document as IHTMLDocument2).body.get_innerHTML;
(das habe ich irgendwo abgeschrieben)

- Dann verändere ich den String nach Lust und Laune.
Ich füge beispielsweise anderen HTML-Inhalt ein, oder ich füge ein alert('Hello World!'); in einem SCRIPT-Bereich ein.

- Auf Knopfdruck (Button-Handler) schreibe ich den veränderten String wieder in den Browser zurück:
Code:
(WebBrowser1.Document as IHTMLDocument2).body.set_innerHTML(HTMLSource);
Ergebnis:

- Alles was HTML ist (Tags, CDATA, etc.) wird perfekt im Browser angezeigt, und zwar ohne Umschweife sofort nach Aufruf von set_innerHTML.

- Aber alles was mit JavaScript zu tun hat: Fehlanzeige.
--> Lese ich den Quelltext erneut mit get_innerHTML aus (genau wie oben), so ist der JS-Code vorschriftsmäßig eingefügt worden, aber __ausgeführt__ wird er nicht.

Konclusion:

Ich glaube, ich muss der WebBrowser-Komponente irgendwie mitteilen, dass er den Quelltext bitte nochmal "neu rendern" soll. So als würde er die Seite neu betreten, aber meine Änderungen beibehaltend.

Frage:

Geht das überhaupt so wie ich das will, oder muss ich z.B. einen externen HTTP-Socket verwenden, um den Request zu senden, und dann "on-the-fly" den Quelltext ändern, und ihn erst dann dem Browser zusenden?

Falls ja würde mich das aber zu dem Problem bringen, dass ich ja den vom Browser möglicherweise höchst komplizierten Request irgendwie nachbilden müsste, oder ich müsste einen Proxy bauen...?
O Gott, muss ich wirklich einen Proxy schreiben, nur um ein alert in eine Seite einzubauen?!
Das kann ich mir nicht vorstellen.


Es bittet um Hilfe und dankt im Voraus
Caps

Illustrierendes Beispiel:

Von www.example.de empfangener Code:
Code:
<html>
<head>
<title>Example-Page</title>
</head>
<body>
Hello World!
</body>
</html>
Nach meiner Veränderung sieht der Code so aus:
Code:
<html>
<head>
<title>Example-Page</title>
</head>
<body>
<script type="text/javascript"> alert('Willkommen!'); </script>
Hallo Welt!
</body>
</html>
Effekt: der Browser zeigt zwar "Hallo Welt" statt "Hello World!" an, aber es kommt kein alert-Fenster.

PS Lösungen, um von lokal den HTML-Code in den Browser zu laden, helfen leider nicht, weil in dem Quellcode relative Pfade zu Resourcen auf dem Server enthalten sind, die lokal nicht funktionieren.

Bernerbaer 29. Okt 2010 11:59

AW: TWebBrowser: JavaScript "anstoßen" nach Quelltextänderung
 
Zitat:

Zitat von Caps (Beitrag 1058456)
PS Lösungen, um von lokal den HTML-Code in den Browser zu laden, helfen leider nicht, weil in dem Quellcode relative Pfade zu Resourcen auf dem Server enthalten sind, die lokal nicht funktionieren.

Doch, sollte so schon lösbar sein mit Hilfe von <base href="http://www.originaldomain.com"> im Header der HTML-Seite.

Caps 29. Okt 2010 12:20

AW: TWebBrowser: JavaScript "anstoßen" nach Quelltextänderung
 
Zitat:

Zitat von Bernerbaer (Beitrag 1058468)
Zitat:

Zitat von Caps (Beitrag 1058456)
PS Lösungen, um von lokal den HTML-Code in den Browser zu laden, helfen leider nicht, weil in dem Quellcode relative Pfade zu Resourcen auf dem Server enthalten sind, die lokal nicht funktionieren.

Doch, sollte so schon lösbar sein mit Hilfe von <base href="http://www.originaldomain.com"> im Header der HTML-Seite.

Hm, scheint zu funktionieren :cyclops:. Ich danke sehr für diesen Tipp, aber ich breche noch nicht in Jubel aus; weil ich mir noch unsicher bin, ob das mein Problem wirklich löst; für den Anfang jedenfalls sieht es sehr gut aus, danke nochmals! Ich markiere den Thread als "gelöst", wenn ich genügend getestet habe...

Caps


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:33 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