julia
I'm new here

APPCenter getCurrentDocument().getElementById("XXX") liefert kein w3c Objekt

Hallo zusammen,

ich versuche vergebens im AppCenter auf ein iFrame zuzugereifen um Bilder für Drap&Drop zu registieren.

Wenn ich per JavaScript die Sachen auslese, sind diese da und die Methode getElementById() liefert mit ein HTMLIFrameElement (iFrames sind verdschachtelt) zurück.

_application.inject(new MyJavaObject(this), "myObject");

String scriptVor = "" +

   "var iframe = document.getElementById('frame_3');" +

   "alert('Das ist das 2 iFrame' + iframe);" +

   "var innerIFrame = iframe.contentWindow.document.getElementById('frameWidget_widgetID=3');" +

   ........;

_application.executeScript(scriptVor);

Wenn ich versuche dies auf Java Ebene durchzuführen:

HTMLIFrameElement node = (HTMLIFrameElement)_application.getCurrentDocument().getElementById("frame_3");

Erhalte ich eine ClassCastException, weil der Aufruf mir ein Objekt der Klasse:

class de.espirit.firstspirit.client.gui.applications.jxbrowser4.$Proxy701

zurück liefert. Was ist das für eine Klasse und komme ich von diesem Objekt irgendwie an das HTMLIFrameElement Objekt?

Wenn irgendwie die Möglichkeit bestehen würde, dann würde ich auch das Parsen in JavaScript machen. HIer habe ich aber das Problem, dass

ich dann das z.B. Node Objekt nicht wieder zurück zur Java-Anwendung schicken kann, damit dort die Bilder registriert werden.

Für jede Hilfe bin ich sehr dankbar.

Gruß Julia

0 Kudos
8 Replies
StefanSchulz
I'm new here

Hallo Julia,

ein Cast auf HTMLIFrameElement funktioniert deswegen nicht, weil kein HTML DOM sondern reine w3c DOM Objekte geliefert werden. Ein Cast auf Element sollte entsprechend funktionieren. Die Interpretation der Attribute und Inhalte muss selbsttätig erfolgen.

Das Proxy-Objekt basiert auf einer (temporären) Klasse, die vom JXBrowser erstellt wird. Diese implementiert lediglich das Standard-Interface und nicht das spezielle HTML-Interface.

Beste Grüße

Stefan

0 Kudos

Hallo Stefan,

ich übernehmen mal hier, da Julia gerade im Urlaub ist. Danke für deine Antwort, aber mit der Information komme ich leider nicht weiter.

Das habe ich nun geändert:  Element element =_application.getCurrentDocument().getElementById("frame_3");

Ein Cast ist so nicht notwendig, da getElementById ein w3c Element zurück liefert. So hätten wir das iFrame dann als w3c Element vorliegen. Nun wollen wir auf das im iFrame liegende Dokument bzw. die Elemente zugreifen. Du meintest ja, dass die Interpretation der Attribute und Inhalte selbsttätig erfolgen muss. Wäre super, wenn du dies vielleicht etwas genauer erläutern könntest, da ich hier gerade einfach gar nicht weiterkomme.

Vielen Dank schon mal im Voraus für deine Antwort!

Lieben Gruß,

Sebastian

0 Kudos

Hi Sebastian,

ja, vielleicht umständlich ausgedrückt. Mit dem HTMLIFrameElement werden ja einige Eigenschaften direkt zugreifbar. Diesen direkten Zugriff gibt es in Element ja nicht, daher müsst ihr die Attribute usw. selbst auslesen (ich denke mal, dass diese dort zur Verfügung stehen). Ebenso gibt es keine HTML-spezifische Methoden auf dem Objekt. Diese muss man dann ebenfalls selbst "nachprogrammieren", wenn man sie benötigt.

Beste Grüße

Stefan

0 Kudos

Moin Stefan,

ich hatte dich glaube ich bei deinem ersten Post schon verstanden. Danach habe ich mich wohl etwas unverständlich ausgedrückt. Mir war nach deinem Post bewusst, dass wir z. B. nun die Methoden vom HTMLIFrameElement nicht haben. Daher war nun erstmal mein Gedanke irgendwie an die Informationen im Element zu kommen bzw. diese auszulesen. Wie ich diese mache, ist mir jedoch gerade total unklar.

Ein Gedanke war beispielweise den Inhalt des Elements als xml String auszugeben, ihn evtl. leicht zu verändern und als neues Document (w3c) einzulesen. Hab ich aber irgendwie nicht hinbekommen.

Hast du da vielleicht einen Lösungsansatz? Wir sind ja bestimmt nicht die Ersten die im AppCenter-Slot auf die Elemente von einem iFrame zugreifen wollen.

Danke für deine Hilfe und lieben Gruß,

Sebastian

0 Kudos

Hi Sebastian,

öhm, da würde ich doch erstmal vermuten, dass die Standard-Methoden eines w3c.dom.Element die Informationen liefern. Entweder stehen diese ja als Attribute an dem Element (getAttribute oder getAttributeNode) oder es sind innere Elemente (getElementByTagName). Zum Verändern gibt es die passenden Setter für Attribute bzw. Manipulatoren, die Element von Node erbt (getChildNode, removeChild, replaceChild, get/setTextContent).

Im Prinzip arbeitet man hier auf einem generischen DOM-Dokument, das man aber auch genau so verarbeiten kann. Um das Ganze von und nach XML zu bringen, müsste man sich vermutlich eines XMLParsers bzw. XMLTransformers bedienen.

Hilft das weiter? Ist textuell immer ein wenig umständlich. Smiley Happy

Beste Grüße

Stefan

0 Kudos

Moin,

ja textuell ist es echt immer recht umständlich. Ich hätte vorhin auch etwas ausführlicher sein können. Die Standard-Methoden habe ich soweit nämlich schon durchprobiert mit keinem Erfolg. So liefert z. B. folgendes:

Element element =_application.getCurrentDocument().getElementById("frame_3");
String name = element.getNodeName();
// NamedNodeMap namedNodeMap = element.getAttributes();
NodeList divlist = element.getElementsByTagName("div");
NodeList children = element.getChildNodes();

Logging.logInfo(

   "IFRAMEINFO: name: " + name +

   // "; namedNodeMap length: " + namedNodeMap.getLength() +
   "; elementByTagNameDiv length: " + divlist.getLength() +

   "; children length: " + children.getLength()

   , LOGGER);

--->

INFO  15.10.2020 16:46:02.155 (com.nord.mam.ContentservPlugin): IFRAMEINFO: name: IFRAME; elementByTagNameDiv length: 0; children length: 0

Der Name passt ja soweit, aber es müssten mehrere div-Elemente und children da sein. Es sollte hier kein Timing Problem geben, da vorher ein sleep gesetzt wird, damit alle Iframes geladen sind.

Die Zeile mit "element.getAttributes();" musste ich aus kommentieren, da hier folgende Exception geworfen wird:

ERROR 15.10.2020 16:40:40.036 (de.espirit.firstspirit.client.gui.applications.browser.BrowserApplicationImpl): error handling browser event. browser listener=com.nord.mam.ContentservPlugin@f8798f - java.lang.UnsupportedOperationException

FSVersion=5.2.200312.78911#5628;JDK=1.8.0_241 32bit Oracle Corporation;OS=Windows 10 10.0 x86;Date=15.10.2020 16:40:40 (I)

java.lang.UnsupportedOperationException

at de.espirit.firstspirit.client.gui.applications.jxbrowser4.NodeImpl.getAttributes(NodeImpl.java:107)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.lang.reflect.Method.invoke(Unknown Source)

at de.espirit.firstspirit.client.gui.applications.jxbrowser4.DocumentProxyHandler$1.invoke(DocumentProxyHandler.java:39)

at de.espirit.firstspirit.client.gui.applications.jxbrowser4.$Proxy71.getAttributes(Unknown Source)

at com.nord.mam.ContentservPlugin.registerPictures(ContentservPlugin.java:348)

at com.nord.mam.ContentservPlugin.onDocumentComplete(ContentservPlugin.java:201)

at de.espirit.firstspirit.client.gui.applications.browser.BrowserApplicationImpl$5.invoke(BrowserApplicationImpl.java:625)

at de.espirit.firstspirit.client.gui.applications.browser.BrowserApplicationImpl$5.invoke(BrowserApplicationImpl.java:622)

at de.espirit.firstspirit.client.gui.applications.browser.BrowserApplicationImpl$2.run(BrowserApplicationImpl.java:490)

at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)

at java.util.concurrent.FutureTask.run(Unknown Source)

at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

at java.lang.Thread.run(Unknown Source)

Sorry, die Info hätte ich auch mal vorhin schon erzählen können. Somit komme ich dort mit den Methoden halt nicht weiter. Weißt du, wo dort das Problem sein könnte?

Lieben Gruß,

Sebastian

0 Kudos

Hi,

hm. Doof. Scheint so, als würde JXBrowser die DOM-API nicht vollständig implementieren/unterstützen.

Im iframe-Element selbst werden vermutlich keine weiteren Elemente enthalten sein (es sei denn, ein "Ihr Browser kann keine iframes"-Text). Dieser referenziert ja lediglich ein externes HTML-Dokument. Und da hier kein HTMLIFrameElement geliefert wird, bin ich mir nicht sicher, ob man an dieses überhaupt herankommt. :smileyconfused:

Da weiß ich jetzt leider auch nicht weiter. Hier müsste man an die DOM-Doku von JXBrowser 4 ran. Habe ich leider nichts zu gefunden.

Beste Grüße

Stefan

0 Kudos

Okay, danke für deine Hilfe. Dann wende ich mich noch mal an den Support.

Lieben Gruß,

Sebastian

0 Kudos