Questions & Answers

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

Type a product name