jQuery .change() Method - automatisches Nachladen bei automatisierter Webseitenbestückung funktionert nicht
Oe
- html
- javascript
- php
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?
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
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
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?
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.
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
Hallo Rolf,
😀 Ahh, jetzt hab` ich's verstanden! ..... es funktioniert!
😀 Besten Dank für dein Hilfe! 😀
Mache das VB.Net 😀
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
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
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
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
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
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
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
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
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
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
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 😟
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
Scheinbar muss 'on'+event genommen werden (onchange, onmouseover,..) "change" läuft in den Fehler "Ungültiges Argument"
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
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
Hallo,
Scheinbar muss 'on'+event genommen werden (onchange, onmouseover,..) "change" läuft in den Fehler "Ungültiges Argument"
"onchange" oder "onChange"?
Gruß
Kalk
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
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")“
Hallo Oelkanne,
gibt es auf der Seite denn eine globale Funktion namens "change"?
Rolf
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
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
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
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
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:
Wie Du das auf VB heraus machst? Keine Ahnung.
Rolf
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)
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