Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IE10: "javascript:" versus "execScript" (https://www.delphipraxis.net/174696-ie10-javascript-versus-execscript.html)

Caps 6. Mai 2013 11:56

IE10: "javascript:" versus "execScript"
 
Hallo,

ich habe wiedermal eine Frage zum TWebBrowser in Verbindung mit dem IE10...

Folgendes ist mir aufgefallen:
Ich kann in einem Testprogramm JavaScript auf zwei verschiedene Weisen ausführen, einmal über das WebBrowser-Object mithilfe der Funktion execScript() und einmal über die "Adresszeile", also über die Methode Navigate('javascript: ...').

Bis zum IE8 scheinen sich beide Arten der Ausführung gleich zu verhalten, jedenfalls bei den Scripten, die ich bisher in der Mangel hatte.
Nur beim IE10 scheint es einen Unterschied zu geben, der mir jetzt Schwierigkeiten bereitet.

Beispielcode kann ich leider wiederum nur fetzenweise geben (ext. Firmenseite):
Dies ist die Definition zweier Radiobuttons, auf die ich einen automatisierten Klick ausführen will:
Code:
<td>
<input type="radio" name="rbInsuredEvent" id="rbInsuredEvent0" value="false" onclick="datInstance.switchInsuredEventState();" />
<label for="rbInsuredEvent0">Nein</label>
</td>
<td>
<input type="radio" name="rbInsuredEvent" id="rbInsuredEvent1" value="true" onclick="datInstance.switchInsuredEventState();" />
<label for="rbInsuredEvent1">Ja</label>
</td>
Meine Prozedur zum Ausführen des JavaScript-Codes sieht folgendermaßen aus:
Delphi-Quellcode:
procedure TForm1.ExecuteJavaScriptButtonClick(Sender: TObject);
var
   document: IHTMLDocument2;
   document_window: IHTMLWindow2;
begin
if trim(js_function.Text) <> '' then begin // JS-Funktion über "Adresszeile" ausführen...
   AddressEdit.Text := 'javascript:' + trim(js_function.Text);
   GoButtonClick(self);
                                     end;

if trim(js_function_2.Text) <> '' then begin // JS-Funktion über Browserobjekt ausführen...
   document := WebBrowser1.document as IHTMLDocument2;
   document_window := document.parentWindow as IHTMLWindow2;
   Try
      document_window.execScript(js_function_2.Text, 'JavaScript');
   except on e: Exception do begin
             showMessage('Fehler bei der Ausführung des JavaScript-Codes');
                             end;
   end;
                                       end;
end;
Ich fülle manuell immer nur entweder das Edit-Feld js_function oder das Edit-Feld js_function_2, so dass nur eine der beiden Wege gegangen wird.

Der Code, den ich ausführen will, ist folgender:
Code:
document.getElementById('rbInsuredEvent0').click()
Bis zum IE8 (auf XP) kein Problem - beide Wege funktionieren.
Beim IE10 auf Win7 (kein Kompatibitätsmodus, sondern erzwungener IE10-Browsermodus) taucht plötzlich ein Unterschied auf, den ich leider Gottes (:wall:) nicht beschreiben kann - es scheint bei Ausführung über das Browserobjekt die Seite kurz neu geladen zu werden (unerwünschtes Verhalten), während bei Ausführung über die "Adresszeile" einfach nur der Radiobutton umschnappt (erwünschtes Verhalten).

Hm, ich weiß, das ist nicht viel Information, aber vllt. hat jemand eine ähnliche Erfahrung gemacht...?
Im Grunde bezieht sich meine Frage darauf, ob Ihr meint, dass es "normal" ist, dass sich bei der Ausführung von JavaScript auf die beschriebenen zwei Weisen das Ergebnis unterscheiden sollte oder nicht. Ich ging bisher davon aus, dass nicht. JS ausführen = JS ausführen, oder nicht?

lg Caps

jaenicke 6. Mai 2013 13:14

AW: IE10: "javascript:" versus "execScript"
 
Ich finde es ein wenig seltsam, dass du dafür JavaScript Code verwendest statt die Elemente direkt anzusprechen. Warum suchst du dir nicht einfach das passende Element? Wenn du das als HTMLInputElement behandelst, kannst du dort auch checked direkt setzen.

Wie du das Element findest, siehst du hier:
http://www.delphidabbler.com/tips/56

Caps 6. Mai 2013 13:24

AW: IE10: "javascript:" versus "execScript"
 
Ja, das stimmt. Ich hatte damit aber gleich einen Eventhandler verbunden, der den Prozess auf der Seite fortgesetzt hat.
Das könnte ich vermutlich jetzt über das OnChange-Event des Radio-Buttons lösen, was feuert, wenn ich den Wert setze oder?

lg Caps

sx2008 6. Mai 2013 14:20

AW: IE10: "javascript:" versus "execScript"
 
Du könntest auch die click() - Methode aufrufen:
Delphi-Quellcode:
var
  Elem: IHTMLElement;
begin
  Elem := ...
  OleCheck(Elem.click());

Caps 6. Mai 2013 14:45

AW: IE10: "javascript:" versus "execScript"
 
Ah, auch nicht schlecht, danke.


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