Aller au contenu principal

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

Commentaires

8 commentaires

  • Zendesk API User
    Author: StefanSchulz - 10/15/2020 7:55

    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
  • Zendesk API User
    Author: sebbec - 10/15/2020 12:18

    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
  • Zendesk API User
    Author: StefanSchulz - 10/15/2020 12:28

    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
  • Zendesk API User
    Author: sebbec - 10/15/2020 13:57

    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
  • Zendesk API User
    Author: StefanSchulz - 10/15/2020 14:09

    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. :smileyhappy:

    Beste Grüße

    Stefan

    0
  • Zendesk API User
    Author: sebbec - 10/15/2020 15:53

    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
  • Zendesk API User
    Author: StefanSchulz - 10/15/2020 16:36

    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
  • Zendesk API User
    Author: sebbec - 10/16/2020 9:28

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

    Lieben Gruß,

    Sebastian

    0

Vous devez vous connecter pour laisser un commentaire.