Oe: jQuery .change() Method - automatisches Nachladen bei automatisierter Webseitenbestückung funktionert nicht

Guten Abend,

Ich versuche ein Drop Down Menü einer Webseite automatisch zu bestücken.

Ich war bereits in einen anderen Forum unterwegs, jedoch konnte dort keiner helfen. https://www.vb-paradise.de/index.php/Thread/133562-jQuery-change-Method-automatisches-Nachladen-funktionert-nicht/?s=e22e915ff8d47761a79f0a17c1c12f237aaf3182

Mein Problem: Durch Auswahl eines Eintrags des Drop Down Menüs werden Inhalte weiterer Drop Drop Down Menüs nachgeladen mit der jQuery .change() Methode. Dies funktioniert auch prima auf der original Webseite, solange ich die Auswahl per „Hand“ mache. Aber sobald ich dies automatisiert mache, wird zwar meine Auswahl zwar angezeigt, aber das Event, welche die weiteren Drop down nachlädt, startet nicht.

Mein Code, der das Drop Down auswählt sieht so aus:

Option Explicit On
Imports SHDocVw
Public Module Main
    Dim IEApp As SHDocVw.InternetExplorer
    Public Sub Main()
        Call initialzation()
        Call Drop_Down("RSS252", "standardCode")
        MsgBox("Program finished")
    End Sub
    Sub initialzation()
        IEApp = CreateObject("InternetExplorer.Application")
        IEApp.Visible = True
        IEApp.Navigate("C:\ISED\trial.html")
        Do While IEApp.Busy Or IEApp.Document.ReadyState <> "complete" : System.Threading.Thread.Sleep(1000) : Loop
    End Sub
    Sub Drop_Down(Auswahl, ElementName)
        For Each htmloption As Object In IEApp.Document.GetElementsByName(ElementName)
            For Each element In htmloption.Options
                If element.Text = Auswahl Then
                    element.Selected = True
                    Exit Sub
                End If
            Next
        Next
    End Sub
End Module

Jedoch wird das event

$("#standardCode").on("change", function (event){.....

nicht ausgelöst.

Leider habe keine Ideen mehr, woran es liegen könnte. Weiß jemand, wie man das „Nachladeevent“ durch Auswahl eines Feldes des Drop Downs automatisiert starten kann?

  1. Hallo Oe,

    wie sieht das Stück HTML aus, wo das standardCode-Element steht? Möglicherweise ist dort ein Teil der Ursache zu finden.

    Denn $("#standardCode") sucht ein Element mit id='standardCode'. Aber deine Drop_Down Methode verwendet GetElementsByName, sucht also nach Elementen mit name='standardCode'.

    Letzteres wäre besser, denn wenn Du mehrere Elemente mit der gleichen ID hast wäre das ein Verstoß gegen die Regeln von HTML.

    Das zweite Problem ist, dass Du die selected-Eigenschaft programmatisch setzt (ich nehme mal an, dass das <option> Elemente eines <select> sind). Programmatische Veränderungen dieser Art triggern aber keine Events; das ist Absicht. Das Event musst Du selbst auslösen.

    Wie das bei einem als Webbrowser-Control in VB funktioniert - tjaaaaa. Ist das überhaupt VB oder VB.NET? Oder ist das VBA? Oder VBScript? Ich habe vor 20 Jahren mal das Webbrowser-Control mit C# eingebunden, das ist verdammt lang her. Ich meine auch, dass es da Events gibt, auf die Du lauschen kannst, d.h. Du musst keine Warteschleife machen um das Fertigstellen des Navigate abzuwarten. Es müsste ein Event geben, das nach erfolgreichem Navigate feuert. Aber das mag je nach der verwendeten VB-Geschmacksrichtung nicht möglich sein.

    Für das Triggern von Change musst Du grundsätzlich die DispatchEvent-Methode des Select-Elements aufrufen und ein Change-Event mitgeben. Aber wie das in VB gemacht wird? Keine Ahnung.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hallo Rolf,

      Sorry, hatte den link zum HTML Seite vergessen. Es handelt sich um die Passage "Radio Standard Specification (RSS)" der Webseite.

      https://www.vb-paradise.de/index.php/Attachment/50389-trial-html

      Gruß Oelkanne

      1. Hallo Rolf,

        Habe versucht, mich entsprechend deinen Hinweis mit dem dispatchEvent auseinanderzusetzten. (... noch nicht so richtig verstanden..) Ein

        IEApp.Document.dispatchEvent("standardCode")
        

        funktionert jedoch nicht. (passiert nichts)

        An einer anderen Stelle der Seite, kann ich jedoch die Javafunktion

        $("#editEmission").on("click", function (){...
        

        html:

        <div class="form-group">
                    <div class="col-xs-2 col-sm-2 col-md-2 col-lg-2 col-xs-offset-6 col-sm-offset-6 col-md-offset-6 col-lg-offset-6">
                        <button id="editEmission" type="button" name="editEmission" class="btn btn-success btn-xs">Lookup</button>
                    </div>
        </div>
        

        mit

        .getelementbyid("editEmission").Click
        

        starten, ohne die Javafunktionen seperat zu befeuern.

        Was ist der Unterschied hinsichtlich des Befeuerens eines Buttons und DropDowns?

        1. Hallo Oelkanne,

          der Unterschied ist, dass es zum Triggern eines Klicks eine explizte Methode im DOM gibt: Click.

          IEApp.Document.dispatchEvent("standardCode")

          Das kann nicht funktionieren. DispatchEvent braucht ein Event-Objekt. Ich habe nochmal geforscht. Das change-Event wirft ein generisches Event-Objekt, kein spezielles wie MouseEvent oder KeyboardEvent.

          Die Dokumentation bei MS ist - wie üblich - write-only. Wer weiß, wie es geht, kann sie schreiben. Aber wer nicht weiß, wie es geht, kann sie nicht lesen. Immerhin gibt's zwischendurch mal Beispiele.

          Guckst Du hier

          Und ich habe diesen Thread bei Stackoverflow gefunden.

          Ich würde also annehmen, dass Du so vorgehen musst:

          Dim changeEvent
          changeEvent = IEApp.Document.createEvent("HTMLEvents")
          changeEvent.initEvent "change", true, true
          
          ???.dispatchEvent changeEvent
          

          Für ??? brauchst Du das Select-Element, das den Change melden soll. Also vermutlich das, was Du mit GetElementsByName(ElementName) ermittelt hast. Wobei GetElementsByName - wie der Name sagt - eine Collection liefert und kein einzelnes Element, Du müsstest den Trigger-Mechanismus also in die vorhandene Schleife For Each htmloption As Object ... einbauen. Zuerst die Option setzen, dann das Event-Objekt erzeugen und mit htmloption.dispatchEvent abfeuern.

          Keine Garantie für irgendwas - ich habe keine Ahnung in welchem Umfeld du agierst und meine Rückfrage hast Du ignoriert. "VB" ist keine hinreichende Aussage.

          Rolf

          --
          sumpsi - posui - obstruxi
          1. Hallo Rolf,

            😀 Ahh, jetzt hab` ich's verstanden! ..... es funktioniert!

            😀 Besten Dank für dein Hilfe! 😀

            1. Mache das VB.Net 😀

              1. Hallo Oe,

                dann kümmere dich um eine Ablösung. Der Internet Explorer ist mausetot und wird von MS nicht mehr wirklich supported. Die Funktionalität des IE ist im Vergleich zu Chromia (also Chrome, Edge, Opera) oder Füchsen deutlich reduziert. Du wirst den IE zwar noch ein paar Jahre auf Windows Geräten vorfinden, aber definitiv nicht über das Ende dieses Jahrzehnts hinaus.

                Leider gibt es - wie mir scheint - nichts, was der Integration von ShDocVw wirklich nahe kommt. Es gibt das Chromium Embedded Framework (Cef) und eine .net Hülle darum: CefSharp (die auch für VB funktioniert), aber Cef hat keinen direkten Zugang zum DOM. D.h. du hast kein Objekt in VB, mit dem Du direkt dein Select-Element heraussuchen kannst. Statt dessen musst Du JavaScript auf die Seite bringen, das die Arbeit macht, und es gibt Interfaces zwischen der .net und V8 Seite (V8 ist die JavaScript Runtime von Chrome). Das Ganze ist auch ziemlich ressourcenhungrig.

                Schau Dir trotzdem mal CefSharp an. Es ist für open-source Projekte typisch schlecht dokumentiert und sie verweisen auch gern auf Cef, wenn eine Frage über die reine Brückenfunktion hinausgeht. D.h. es ist ziemlich zäh, sich dort hineinzufuchsen.

                Alternativ habe ich noch EO.WebBrowser und Dotnetbrowser - aber die kosten richtig Geld und ich VERMUTE, dass die unter der Haube auch Cef verwenden. EO bringt immerhin .net Wrapperklassen für das DOM mit. Eine Mozilla-basierende Lösung kenne ich nicht, und außer Mozilla und Chromium gibt's ja eigentlich nichts mehr.

                Rolf

                --
                sumpsi - posui - obstruxi
                1. Hallo Rolf,

                  Ja, das mit dem Auslaufen des IExplorers ist für mich als Hobbybastler problematisch. Ich hoffe noch, dass bis zum endgültigen Ende andere Möglichkeiten gibt.

                  Mit der aktuellen Seite ist jedoch noch ein Problem aufgetaucht. Ich kann alle Drop down‘s genau dieser Seite damit bestücken bzw. die Events auslösen.

                  objEvent = IEApp.Document.createEvent("HTMLEvents")
                  objEvent.initEvent("change", True, False)
                  IEApp.Document.getElementById(ElementName).dispatchEvent(objEvent)
                  

                  Jedoch muss ich Seite zig-fach ausfüllen. Sobald die Seite verlassen wird, und die neue leere Seite aufgebaut ist (Seite ist identisch), läuft das .createEvent("..“) in einen Fehler.

                  System.NotSupportedException
                    HResult=0x800A01B6
                    Nachricht = Ausnahme von HRESULT: 0x800A01B6
                    Quelle = Microsoft.VisualBasic
                    Stapelüberwachung:
                     bei Microsoft.VisualBasic.CompilerServices.LateBinding.LateGet(Object o, Type objType, String name, Object[] args, String[] paramnames, Boolean[] CopyBack)
                     bei Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
                  
                  

                  Scheint so, da das Event an die „alte“ Seite gebunden ist.

                  Hast du eine Idee wie man hier vorgehen kann?

                  Gruß Oelkanne

                  1. Hallo Oelkanne,

                    Ich hoffe noch, dass bis zum endgültigen Ende andere Möglichkeiten gibt.

                    Gibt's jetzt schon, aber - beispielsweise - Cef ist deutlich schwieriger zu benutzen.

                    0x800A01B6 bedeutet, dass ein Objekt eine Methode oder eine Eigenschaft nicht kennt. Die Frage ist, was genau er da nicht kennt, das sieht man dem Stack nicht an.

                    Versuch mal, mit dem Debugger einzelschrittweise durchzugehen. Wenn in der Zeile, wo es schiefgeht, mehrere Interaktionen mit MSHTML durchgeführt werden, wie z.B. hier:

                    IEApp.Document.createEvent("HTMLEvents")
                    

                    dann guck ob Du über Inspektor rauskriegen kannst, welcher der Teile schiefgeht. Im Zweifelsfall nimm die Zeile auseinander und speichere die Teilergebnisse in Variablen.

                    Eins ist auf jeden Fall klar: Wenn die Seite neu geladen wurde, ist das bisherige Dokument ungültig. Ein zwischengespeicherter Wert von IEApp.Document darf nicht mehr verwendet werden.

                    Und wie bei der Initialisierung musst Du nach einem Reload der Seite darauf achten, dass die Navigate-Operation abgeschlossen ist. Navigate startet eine asynchrone Operation. Sleep(1000) ist aber schon ziemlich lang. 100ms pro Wartezyklus reicht und erhöht die Schwuppdizität der Anwendung deutlich.

                    Rolf

                    --
                    sumpsi - posui - obstruxi
                    1. Hallo Rolf,

                      IEApp.Document.getelementbyid(...) bei den Feldern auf der neuen Seite werden ausgefüllt (bei deaktivierter eventfunktion).

                      Zeitproblem kann auch ausgeschlossen werden, da Fehler auch im Einzelschritt.

                      dann guck ob Du über Inspektor rauskriegen kannst, welcher der Teile schiefgeht. Im Zweifelsfall nimm die Zeile auseinander und speichere die Teilergebnisse in Variablen <

                      Mit dem Mouseover im Einzelschritt:

                      objEvent: Nothing IEApp.Document: DirectCast(IEApp.Document, mshtml.HTMLDocumentClass) = 'DirectCast(IEApp.Document, mshtml.HTMLDocumentClass)' löste eine Ausnahme des Typs 'System.InvalidCastException' aus

                      1. Hallo Oelkanne,

                        das ist mir zu verwuselt. Beim Anzeigen des Document kam die InvalidCastException?

                        Aber ich bin an der Stelle wohl auch ausgezählt. Eine VB.NET Anwendung um das selbst zu probieren schreibe ich jetzt nicht.

                        Rolf

                        --
                        sumpsi - posui - obstruxi
                        1. Hallo Rolf,

                          Hier der VB.NET Code, falls du bereit wärst, den Fehler nachzustellen.

                          Dieser trägt in das drop down erst "RSS252" ein. Dann wird die Routine nochmal aufgerufen und es wird "RSS210" eingetragen.

                          soweit funktiniert es.

                          Wenn ich jedoch die Seite nach dem ersten Aufruf ändere (zb. Home und wieder zurück) läuft es in den Fehler.

                          Option Explicit On
                          Imports SHDocVw 'aus Microsoft Internet Controls
                          Public Module Main
                              Dim IEApp As SHDocVw.InternetExplorer
                              Public Sub Main()
                                  Call initialization()
                                  Call Drop_Down("RSS252", "standardCode")
                                  MsgBox("Bitte einmal im Browser die Seite ändern und wieder zurückgehen")
                                  Call Drop_Down("RSS210", "standardCode")
                                  MsgBox("Program finished")
                              End Sub
                              Sub initialization()
                                  IEApp = CreateObject("InternetExplorer.Application")
                                  IEApp.Visible = True
                                  IEApp.Navigate("C:\ISED\trial.html")
                                  System.Threading.Thread.Sleep(2000) : Do While IEApp.Busy Or IEApp.Document.ReadyState <> "complete" : System.Threading.Thread.Sleep(1000) : Loop        '-- Warten
                              End Sub
                              Sub Drop_Down(Auswahl, ElementName)
                                  Dim objEvent
                                  For Each htmloption As Object In IEApp.Document.GetElementsByName(ElementName)
                                      For Each element In htmloption.Options
                                          If element.Text = Auswahl Then
                                              element.Selected = True
                                              objEvent = IEApp.Document.createEvent("HTMLEvents")
                                              objEvent.initEvent("change", True, False)
                                              IEApp.Document.getElementById(ElementName).dispatchEvent(objEvent)
                                              Exit Sub
                                          End If
                                      Next
                                  Next
                              End Sub
                          End Module
                          
                          1. Hallo Rolf,

                            Bitte nimm diesen Code. Damit kannst du direkt gegen eine Live Site testen.

                            Option Explicit On
                            Imports SHDocVw 'aus Microsoft Internet Controls
                            Public Module Main
                                Dim IEApp As SHDocVw.InternetExplorer
                                Public Sub Main()
                                    Call initialization()
                                    IEApp.Document.getElementById("wb-auto-1").Click
                                    Call Drop_Down("RSS252", "radioSpecification")
                                    MsgBox("Einmal im Browser den "search" butoon drücken, dann wieder zurückgehen")
                                    Call Drop_Down("RSS210", "radioSpecification")
                                    MsgBox("Program finished")
                                End Sub
                                Sub initialization()
                                    IEApp = CreateObject("InternetExplorer.Application")
                                    IEApp.Visible = True
                                    IEApp.Navigate("https://sms-sgs.ic.gc.ca/equipmentSearch/searchRadioEquipments?execution=e1s1&lang=en")
                                    System.Threading.Thread.Sleep(2000) : Do While IEApp.Busy Or IEApp.Document.ReadyState <> "complete" : System.Threading.Thread.Sleep(1000) : Loop        '-- Warten
                                End Sub
                                Sub Drop_Down(Auswahl, ElementName)
                                    Dim objEvent
                                    For Each htmloption As Object In IEApp.Document.GetElementsByName(ElementName)
                                        For Each element In htmloption.Options
                                            If element.Text = Auswahl Then
                                                element.Selected = True
                                                objEvent = IEApp.Document.createEvent("HTMLEvents")
                                                objEvent.initEvent("change", True, False)                            ' keine Fnktion auf dieser Seite - nur zum Testen
                                                IEApp.Document.getElementById(ElementName).dispatchEvent(objEvent)   ' keine Funktion auf dieser Seite - nur zum Testen
                                                Exit Sub
                                            End If
                                        Next
                                    Next
                                End Sub
                            End Module
                            
                            1. Hallo Oe,

                              ich wüsste nicht einmal, wie ich diesen Code in ein VB.Net Projekt integrieren kann. Ich kenne nur C#.

                              Die Sub Main kann doch auch nicht alles sein. Braucht es nicht ein Form, auf dem das WebControl sitzt? Was für ein Projekttyp ist das?

                              Rolf

                              --
                              sumpsi - posui - obstruxi
                              1. Hallo Rolf,

                                Macht nichts. Habe einiges gelernt bei Dir! Vielen Dank nochmal.

                                Gruß Oelkanne

                                Nur zur Info: Visual Studio 2019 öffnen - neues Projekt - Konsolenanwednung - und dann Code reinkopieren.

                                Damit "SHDocVw" funktioniert muss man noch: Project - Verweis hinzufügen - COM - Microsoft Internet Controls - OK

                                1. Hallo Oe,

                                  jo, ich hatte eine WinForms Anwendung gemacht.

                                  Und ich kriege den gleichen Fehler. Das scheint - wenn man etwas im Netz rumsucht, ein generelles Problem des InternetExplorer-COM-Objekts zu sein.

                                  Du verwendest hier auch die Scripting-Schnittstelle für einen autarken Browser, die mit der SHDocVw-Komponente überhaupt nichts am Bein hat. Nimm die Referenz wieder aus, dimensioniere IEApp ohne Typ, nimm den Imports weg - und alles funktioniert wie vorher.

                                  Ein Powershell-User hatte als Workaround genannt, dass man nicht die nativen Methoden nehmen solle, sondern die von den IHTMLDocumentN Interfaces. Nur - da gibt's createEvent nicht. Nur ein createEventObject, und ich weiß nicht, wie man die verwenden soll.

                                  Viel Glück - ich bin jetzt wirklich raus.

                                  Rolf

                                  --
                                  sumpsi - posui - obstruxi
                                  1. Das befeuern sollte etwa so gehen

                                    Dim doc4 As IHTMLDocument4 = DirectCast(IEApp.Document, IHTMLDocument4)
                                    Dim doc4el As IHTMLElement4 = DirectCast(doc4.getElementById(ElementName), IHTMLElement4)
                                    Dim dummy As Object = Nothing
                                    Dim eventObj As IHTMLEventObj = doc4.CreateEventObject(dummy)
                                    doc4el.FireEvent("onchange", eventObj)
                                    

                                    ...aber Event wird nicht ausgelöst 😟

                                    1. Hallo Oe,

                                      ohne irgendwas recherchiert zu haben - bist Du sicher, dass der Eventname für FireEvent "onchange" heißt? onchange ist eigentlich der Name des HTML Attributs, mit dem man einen Change-Handler registrieren kann.

                                      Das Event im DOM heißt "change".

                                      Rolf

                                      --
                                      sumpsi - posui - obstruxi
                                      1. Scheinbar muss 'on'+event genommen werden (onchange, onmouseover,..) "change" läuft in den Fehler "Ungültiges Argument"

                                        1. Hallo Oe,

                                          okay. Warum sollte man das auch dokumentieren, liebe Freunde bei Microsoft. Dieser Haufen Interfaces ist einfach nur ein abscheulicher Misthaufen, und die Doku ist eine unbrauchbare, stumpfe Auflistung von Methoden und Parametern, ohne Erklärung von Sinn oder Zweck dessen, was da angeboten wird. Drölf verschiedene Interfaces für HTMLElement - klar, es sind COM Interfaces und wenn erstmal eins definiert ist, darf man es nicht mehr ändern, aber es ist trotzdem GRUSELIG.

                                          fireEvent ist offiziell auf IHTMLElement3 deklariert, nicht IHTMLElement4. Und IHTMLElement4 erbt lauft Doku von IDispatch und nicht von IHTMLElement3, so dass auf dem 4er Interface die Methoden des 3er Interface nicht sichtbar sein dürften. Interessant, dass er die Methode trotzdem findet. Es mag daran liegen, dass das Script-Interface namensgesteuert bindet und ihm das Interface wurscht ist.

                                          Laut Doku hat fireEvent jedenfalls 3 Parameter, und der 3. soll ein ref-Parameter mit einem VARIANT_BOOL sein. Keine Ahnung, wie man das in VB formuliert. Er müsste auch abbrechen, wenn Du die falsche Methodensignatur benutzt, und nicht einfach nichts tun. Seltsam. Und weil es das Scripting Interface ist, gibt's auch keine Interop-Assemblies und kein Intellisense.

                                          Das ist alles alter, IE-basierender Kram, MS depubliziert die Dokumentation dafür, und das, was man noch findet, ist kaum verständlich. Wobei - die meiste MSDN-Doku seit 2005 ist unverständlich. Scheinbar will Microsoft nicht, dass man das benutzt. Du verwendet da eine COM Schnittstelle zum IE, und nicht den IE als Webbrowser-Control. Das macht es nochmal komplizierter.

                                          🤷

                                          Rolf

                                          --
                                          sumpsi - posui - obstruxi
                                          1. Hallo Rolf,

                                            Wobei - die meiste MSDN-Doku seit 2005 ist unverständlich.

                                            och, nun sei nicht unfair! Zumindest die deutschen Übersetzungen sind um Größenordnungen besser geworden.

                                            Ich kann mich noch erinnern, dass ich in den frühen 2000er Jahren öfter mal in der MS-Doku geschmökert habe. Meistens habe ich bestimmte Artikel über Google gesucht, und Google hat damals (vermutlich anhand der IP-Adresse) vermutet, dass ich am liebsten die deutsche Fassung hätte.

                                            Oft war es aber so, dass ich dann den deutschen Text gelesen und mich gefragt habe: Was wollen die von mir?? Wenn ich gar nichts mehr verstanden habe, hab ich stattdessen die englische Originalfassung aufgerufen ... und mir dann an die Stirn geklatscht: Ach das meinen die!
                                            Die maschinelle Übersetzung ins Deutsche war damals wirklich noch unter aller Sau. Das hat sich seither deutlich verbessert.

                                            Live long and pros healthy,
                                             Martin

                                            --
                                            Fische, die bellen, beißen nicht.
                                        2. Hallo,

                                          Scheinbar muss 'on'+event genommen werden (onchange, onmouseover,..) "change" läuft in den Fehler "Ungültiges Argument"

                                          "onchange" oder "onChange"?

                                          Gruß
                                          Kalk

                                          1. Hallo Tabellenkalk,

                                            nee, die Beispiele die man im Netz findet sagen "onchange". Was man aber nicht findet, ist eine sinnvolle Dokumentation der Parameter, die dieser MSHTML Krampf erwartet.

                                            Oder ich suche an der falschen Stelle. Oder MS hat mal wieder alles Wichtige depubliziert.

                                            Rolf

                                            --
                                            sumpsi - posui - obstruxi
                                    2. Ich beschäftige mich zurzeit mit alternativen Lösungen. Es läuft wohl auf CefSharp oder Webview2 hinaus. Erste Eindrücke: Die ersten Gehversuche mit CefSharp sind schon schwierig. Auch scheint man kein „exe“ kompilieren zu können, um das Programm stand Alone zu betreiben. Für Webview2 gibt es wenig Dokumentation für VB.NET.

                                      Da ich dringend die bestehende Lösung weiter betreiben möchte, bis ich CefSharp oder Webview2 ausreichend beherrsche, hier ein neuer Ansatz:

                                      Wie führe ich das Javascript einer bestehenden Webseite aus?

                                      HTML code der Webseite wie gehabt:

                                      <script>
                                              $("#standardCode").on("change", function (event){
                                                  let standardCode = this.value;
                                                  cleanSelect($("#version"));
                                              });
                                      </script>
                                      

                                      Die Idee: Das Ereignis mit Javascript auszuösen: VB.NET code

                                      Dim doc3 = DirectCast(IEApp.Document, IHTMLDocument3)
                                      Dim doc2 = DirectCast(IEApp.Document, IHTMLDocument2)
                                      Dim target = doc3.getElementById("standardCode")
                                      Call doc2.parentWindow.execScript("target.focus();change()", "JavaScript")
                                      
                                      

                                      Jedoch läuft der call … in den Fehler 0x80020101. Es hängt wohl an dem Syntax „("target.focus();change()", "JavaScript")“

                                      1. Hallo Oelkanne,

                                        gibt es auf der Seite denn eine globale Funktion namens "change"?

                                        Rolf

                                        --
                                        sumpsi - posui - obstruxi
                                      2. Hi,

                                        Dim doc3 = DirectCast(IEApp.Document, IHTMLDocument3)
                                        Dim doc2 = DirectCast(IEApp.Document, IHTMLDocument2)
                                        Dim target = doc3.getElementById("standardCode")
                                        

                                        Dein vb-Script kennt jetzt also eine Variable namens target.

                                        Call doc2.parentWindow.execScript("target.focus();change()", "JavaScript")
                                        

                                        Das Javascript kennt die aber nicht. M.E. müßte das getElementById auch im Javascript stehen.

                                        Zur Funktion change wurde ja schon geschrieben.

                                        cu,
                                        Andreas a/k/a MudGuard

                                        1. Hallo MudGuard,

                                          da hast Du recht. Man sollte den Eventhandler auf der Seite entkernen und von this unabhängig machen. Den Wert von #standardCode kann man auch über jQuery beschaffen, bzw. man speichert das jQuery-Set in einer Variablen.

                                          <script>
                                                  const $standardCode = $("#standardCode");
                                                  $standardCode.on("change", standardCodeChanged);
                                          
                                                  function standardCodeChanged(event) {
                                                      let standardCode = $standardCode.val(); 
                                                      cleanSelect($("#version"));
                                                  }
                                          </script>
                                          

                                          Wobei die erste Zeile der Funktion im gezeigten Code überflüssig ist, denn standardCode wird gar nicht verwendet. Vermutlich gibt's noch mehr Code, der darauf zugreift.

                                          Und dann aus dem VB heraus nur noch die Funktion aufrufen, statt Events zu simulieren:

                                          Dim doc2 = DirectCast(IEApp.Document, IHTMLDocument2)
                                          Call doc2.parentWindow.execScript("standardCodeChanged()", "JavaScript")
                                          

                                          Beim direkten Aufruf gibt's dann zwar kein Event-Objekt, aber das scheint ja auch nicht erforderlich zu sein. Rolf

                                          --
                                          sumpsi - posui - obstruxi
                                          1. Guten Abend Rolf, MudGuard

                                            Das vollständige html FIle, das ich befüllen möchte, zur Orientierung anbei:

                                            [html datei]( h t t p://gerald.ddnss.org:8080/share.cgi?ssid=0E84F4g)

                                            Edit Rolf B: Vorsicht, nur mit der Kneifzange anfassen! Das ist keine einfache Vorzeigeseite, das ist komplexer Kram von irgendwoher

                                            @MudGuard

                                            Call doc2.parentWindow.execScript("standardCode.focus();change()", "JavaScript")
                                            

                                            läuft in den gleichen Fehler

                                            @Rolf

                                            Leider verstehe ich deinen Vorschlag nicht.

                                            ..man speichert das jQuery-Set in einer Variablen.

                                            Heißt das, man kann ein zusätzliches Script auf die bestende Webseite ergänzen? ..aus einer Variablen? und dann mit VB.Net ausführen? Falls ja, könntest du ein Beispiel geben, wie ein Script in html ergänzt wird?

                                            Viele Grüße

                                            Oelkanne

                                            1. Hallo Oe,

                                              wenn das deine Seite ist: Klar kannst Du Script ergänzen. Ist schon genug drin, im app.js sind 112 Module gebündelt, auf etwas mehr kommt's nicht an.

                                              Wenn das nicht deine Seite ist: Was tust Du da? Fremde Seiten fernsteuern? Mein Browser bekam erstmal Herzklappenstillstand und warnte mich auf Knien, diese Seite nicht zu speichern.

                                              So schlimm war's dann nicht, aber da ist jQuery drin, Underscore, require - über 500k in 112 Modulen einer minifizierten und gebündelten app.js.

                                              Den String "standardCode" finde ich gar nicht. Entweder lädt er noch mehr nach, oder baut diesen Namen irgendwie zusammen.

                                              Grundsätzlich ein eigenes Script einkleben sollte gehen per:

                                              • Script-Element per document.createElement("script") anlegen
                                              • diesem Element das Script als textContent zuweisen
                                              • Element an den Head anhängen

                                              Wie Du das auf VB heraus machst? Keine Ahnung.

                                              Rolf

                                              --
                                              sumpsi - posui - obstruxi
                                              1. Hallo Rolf,

                                                Ich bin Nutzer dieser Seiten und befülle diese schon seit Jahren mit meinen VB.NET Tool. Nun gab es die Änderung, das nach erst nach Auswahl eines Punktes des ersten Drop Down Menüs die Inhalte des 2 drop downs nachgeladen werden. Wenn das Zweite ausgewählt wurde, werden die Inhalte für das Dritte nachgeladen usw.

                                                Komplex ja, aber nichts illegales!

                                                Die ID: standardCode, die für das erste Drop down zuständig ist, findest du in Zeile 361. (Die Auswahl klappt, aber das befeuern des scripts zum Nachladen nicht)

                                                Das Javascript "standardCode", welche das Nachladen für das nächste drop down steuert ist in Zeile 649 zu finden.

                                                Das mit "Injizieren" von javascript in eine geöffnete Website scheint richtig knifflig. Aber geht das denn? Wird Javasript nicht eigentlich vom Server ausgeführt? (und nicht vom Clientrechner)

                                                1. Hallo Oe,

                                                  Wird Javasript nicht eigentlich vom Server ausgeführt? (und nicht vom Clientrechner)

                                                  Man kann JavaScript am Server ausführen lassen, aber das ist dann nicht das JavaScript, das Du im Browser siehst.

                                                  JavaScript im Browser wird vom Browser ausgeführt.

                                                  Deine Zeilennummern dürften nur funktionieren wenn ich deine Seite tatsächlich aufrufe, statt nur als Text anzuschauen. Da ich nicht erkenne, was sie tut und was sie drive-by mitschleppen könnte, werde ich das nicht machen.

                                                  Die Idee mit "entkernen" war also Unsinn von mir, ich hatte die Historie des Threads nicht mehr im Kopf.

                                                  Es könnte aber trotzdem sinnvoll sein, einen eigenen Scriptblock in die Seite einzuschmuggeln und darin eine Funktion aufzurufen. Wenn das denn so geht wie Du es mit execScript angedeutet hast - sowas hab ich noch nicht gemacht.

                                                  Aber aus einer JavaScript-Funktion heraus das Change-Event zu triggern ist sicherlich einfacher als über VB. Du musst nur aufpassen, dass Du es nicht mehrfach tust. Gib dem Script-Element eine ID und frage ab, ob die ID da ist, bevor Du es erzeugst und einfügst.

                                                  Wie man in JavaScript ein Change-Event triggert, das hatten wir - glaube ich - in diesem Wurmthread schonmal.

                                                  Rolf

                                                  --
                                                  sumpsi - posui - obstruxi