Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Von Javascript adapter auf das DOM in der vis zugreifen

    NEWS

    • Amazon Alexa - ioBroker Skill läuft aus ?

    • Monatsrückblick – September 2025

    • Neues Video "KI im Smart Home" - ioBroker plus n8n

    Von Javascript adapter auf das DOM in der vis zugreifen

    This topic has been deleted. Only users with topic management privileges can see it.
    • I
      iob69 @Codierknecht last edited by

      @codierknecht
      Was ist denn mit "clients" gemeint?
      Sorry für meine dummen Fragen, ich weiss da zu wenig wie das aufgebaut ist. Aber soweit ich weiss, ist ja das ganze vis in einem einzigen Java-Modul. Falls ich mich irre, bitte korrigieren. Aber dann würde es ja keine rolle spielen welches view gerade offen ist?

      Codierknecht 1 Reply Last reply Reply Quote 0
      • Codierknecht
        Codierknecht Developer Most Active @iob69 last edited by

        @iob69 sagte in Von Javascript adapter auf das DOM in der vis zugreifen:

        Was ist denn mit "clients" gemeint?

        Die Browser auf z.B. Deinen Tablets oder dem PC/Mac.
        Die "holen" sich das was anzuzeigen ist vom Server (ioBroker, VIS-Adapter). Das können gleichzeitig nahezu beliebig viele sein.
        Was da jetzt z.B. in einem der gerade aktiven Browser aktuell gemacht wird (sortieren). kriegt der Server nicht mit.

        I 1 Reply Last reply Reply Quote 0
        • OliverIO
          OliverIO @iob69 last edited by

          @iob69 sagte in Von Javascript adapter auf das DOM in der vis zugreifen:

          @oliverio
          Das heisst also im klartext nein, schade...
          Danke trotzdem.

          PS: Deine drei letzten Sätze sind schwer zu verstehen. Denke, du arbeitest mit einem speech to txt programm?

          Ja, habe die Sätze korrigiert. Die diktierfunktion immiphone hat mit JavaScript Schwierigkeiten

          I 1 Reply Last reply Reply Quote 0
          • I
            iob69 @Codierknecht last edited by

            @codierknecht
            Das macht ja nicht der Browser, sondern der Java-Script-Adapter und das ist immer der selbe.
            Vielleicht hab ich mich da nicht richtig ausgedrückt, ich möchte, dass der Javascript-Adapter auf das HTML-Widget zugreifen kann und das steuern kann.

            Das mit verschiedenen clients:
            Wenn zwei verschiedene browser auf das selbe view zugreifen und dort sachen manipulieren, z.B. eine Steckdose ein und ausschalten, dann ist das ja auch kein problem, ausser dass dann halt der am einen Browser nicht weiss, wieso die Steckdose jetzt wieder ausgeschaltet hat. Aber damit muss man ja auch leben.

            Codierknecht 1 Reply Last reply Reply Quote 0
            • I
              iob69 @OliverIO last edited by

              @oliverio
              Das war ja auch nur ein PS, also eine Randnotiz. Ich hab die Sätze dann nach einer Weile schon verstanden :-). Mit Iphone hat das Iphone offenbar auch Schwierigkeiten 😉

              1 Reply Last reply Reply Quote 0
              • OliverIO
                OliverIO @iob69 last edited by OliverIO

                @iob69 sagte in Von Javascript adapter auf das DOM in der vis zugreifen:

                @oliverio
                Das heisst also im klartext nein, schade...

                Eigentlich nein. Nur ein laufendes JavaScript kann nicht auf den Browser zugreifen.
                Du kannst allerdings JavaScript in einen datenpunkt schreiben und den in einem html Element anzeigen lassen. Aber das ist meist nicht so sinnvoll.

                Evtl schreibst du nochmal was du genau vorhast.
                Im groben habe ich verstanden:

                • Du hast eine Tabelle
                • du möchtest den Inhalt bei Klick nach Spalten sortieren

                Da muss man beachten, das man den datentyp berücksichtigen muss, da Zahlen numerisch aber auch nach Text sortiert werden können, aber dann andere Ergebnisse herauskommen. Datum ist auch nochmal ein Sonderfall.

                Das könnte man so generalisieren, das man in vis ein Standard JavaScript ist, das regelmäßig nach einer css Klasse sucht, wenn gefunden fügt es dort beim Header hoch/runter Pfeile ein und wenn es die typinformation hat, kann es durch Klick entsprechend richtig sortieren. Die typinformation könnte man ebenfalls durch eine zusätzliche css Klasse am Header machen oder durch ein kleines zusatzjavascript, das diese Information liefert.

                Wenn du mehr Informationen lieferst, sowie ein echtes Beispiel könnte ich dir sowas bauen. Erzähl auch mal woher die Tabelle kommt. Wer baut die? Du selber mit JavaScript?

                I 1 Reply Last reply Reply Quote 0
                • Codierknecht
                  Codierknecht Developer Most Active @iob69 last edited by

                  @iob69

                  Z.B. möchte ich eine Liste Anzeigen, welche ich in der Vis per Drag and Drop sortieren kann

                  Das Sortieren - also das rumfummeln am DOM - kann nur die JS-Engine im Browser.
                  Du könntest das in dem einen Browser machen, in einen "Zwischen"-Datenpunkt des ioBroker zurückschreiben und dort per Script auf den geänderten Wert reagieren. Also damit den Original-DP aktualisieren. Jeder andere Browser kriegt dann den neuen Wert im Original-DP mit und zeigt den - z.B. anders sortiert - entsprechend an.

                  1 Reply Last reply Reply Quote 0
                  • I
                    iob69 @OliverIO last edited by iob69

                    @oliverio
                    Das klingt alles ein bisschen kompliziert. Mit dem DOM wäre das halt (wohl) viel einfacher.
                    Aber ok, ich hab eine sortierbare Tabelle wie z.B. in angehängter Beispiel-HTML-Datei:
                    DragAndDrop.html
                    Achtung, es sollen nicht spalten sortiert werden sondern nur die Reihenfolge der Zeilen (vom Benutzer) per Drag and drop (bitte kurz Datei öffnen und ausprobieren)
                    Das problem ist, dass ich die Daten, (im Javascript-Adapter) vom Netz hole. Der Benutzer möchte aber je nachdem die Daten in einer anderen Reihenfolge haben. Nun ist im Beispiel ja alles zusammen, css, html und java. Aber ich bräuchte eine Verbindung vom Vis, wo nur die HTML-Tabelle sein soll, welche über einen Datenpunkt vom Javascript-Adapter aus aufgebaut wird. Das würde ja auch funktionieren, soweit bin ich schon.
                    Das problem ist allerdings bei der Sortierung, dass ich die im javascript-Adapter nicht mitbekomme.
                    Die Daten (das Model) solle aber im Javascript-Adapter bleiben, da damit auch statistik gemacht wird usw.
                    Aber ich glaub, wenn es dann zu kompliziert wird, sortier ich das mit Eingabe der ID und knöpfen auf/ab. Ist halt mühsamer.

                    Codierknecht OliverIO 2 Replies Last reply Reply Quote 0
                    • Codierknecht
                      Codierknecht Developer Most Active @iob69 last edited by

                      @iob69
                      Du könntest ja nach dem drop den ganzen Salat als JSON an den ioBroker senden (temp. DP) und dort wiederum per Trigger auf den DP das JSON verarbeiten und irgendwohin (anderer DP) speichern.

                      Was jetzt insgesamt komplizierter ist, überlasse ich Dir 😁

                      I 1 Reply Last reply Reply Quote 1
                      • OliverIO
                        OliverIO @iob69 last edited by OliverIO

                        @iob69

                        schau mal hier.
                        aus der tabelle hab ich ein json gemacht und in meinem widget vis-jsontemplate aus dem gleichnamigen adapter dann umgesetzt

                        datenpunkt 0_userdata.0.table

                        [
                          {
                            "Name": "Erika Mustermann",
                            "Alter": 34,
                            "Stadt": "Hamburg"
                          },
                          {
                            "Name": "John Doe",
                            "Alter": 25,
                            "Stadt": "New York"
                          },
                          {
                            "Name": "Alice Schmidt",
                            "Alter": 41,
                            "Stadt": "Stuttgart"
                          },
                          {
                            "Name": "Max Mustermann",
                            "Alter": 29,
                            "Stadt": "Berlin"
                          }
                        ]
                        
                        

                        template für das widget

                        <table id="sortable-table"> 
                           <tr>
                               <td>Name</td>
                               <td>Alter</td>
                               <td>Stadt</td>
                           </tr>
                           <% 
                           data.map((item)=>{ 
                           %>
                           <tr draggable="true">
                               <td><%- item.Name %></td>
                               <td><%- item.Alter %></td>
                               <td><%- item.Stadt %></td>
                           </tr>
                           <%
                           });
                           %>
                        
                        </table>
                        <script>
                           const table = document.getElementById('sortable-table');
                           let draggedRow = null;
                        
                           // Beim Drag Start wird die Zeile gespeichert
                           table.addEventListener('dragstart', (e) => {
                             if (e.target.tagName.toLowerCase() === 'tr') {
                               draggedRow = e.target;
                               setTimeout(() => {
                                 e.target.style.display = 'none'; // Die Zeile wird unsichtbar, wenn sie gezogen wird
                               }, 0);
                             }
                           });
                        
                           // Beim Drag Over (über andere Zeilen ziehen)
                           table.addEventListener('dragover', (e) => {
                             e.preventDefault(); // Notwendig, um das Drop-Ereignis zu ermöglichen
                             const targetRow = e.target.closest('tr');
                             if (targetRow && targetRow !== draggedRow) {
                               const rect = targetRow.getBoundingClientRect();
                               const middle = rect.top + rect.height / 2;
                               if (e.clientY > middle) {
                                 targetRow.parentNode.insertBefore(draggedRow, targetRow.nextSibling);
                               } else {
                                 targetRow.parentNode.insertBefore(draggedRow, targetRow);
                               }
                             }
                           });
                        
                           // Nachdem der Drag abgeschlossen ist
                           table.addEventListener('dragend', (e) => {
                             e.target.style.display = ''; // Zeile wieder sichtbar machen
                             draggedRow = null;
                           });
                         </script>
                        

                        die dragdrop funktioniert wegen vis nur im runtime mode

                        943f7e6e-b85a-4262-821b-f5a960f61b0a-20251007-1407-11.5596582.mp4

                        was man noch machen müsste, wäre die gewählte reihenfolge in einen datenpunkt schreiben, so das es das nächste mal genau in der reihenfolge wieder angezeigt werden kann. da wäre ein eindeutige id noch gut.

                        hier mal noch das widget zum importieren

                        [{"tpl":"tplJSONTemplate4","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","json_dpCount":"1","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"json_oid":"0_userdata.0.table","json_template":"<table id=\"sortable-table\"> \n    <tr>\n        <td>Name</td>\n        <td>Alter</td>\n        <td>Stadt</td>\n    </tr>\n    <% \n    data.map((item)=>{ \n    %>\n    <tr draggable=\"true\">\n        <td><%- item.Name %></td>\n        <td><%- item.Alter %></td>\n        <td><%- item.Stadt %></td>\n    </tr>\n    <%\n    });\n    %>\n</table>\n<script>\n    const table = document.getElementById('sortable-table');\n    let draggedRow = null;\n\n    // Beim Drag Start wird die Zeile gespeichert\n    table.addEventListener('dragstart', (e) => {\n      if (e.target.tagName.toLowerCase() === 'tr') {\n        draggedRow = e.target;\n        setTimeout(() => {\n          e.target.style.display = 'none'; // Die Zeile wird unsichtbar, wenn sie gezogen wird\n        }, 0);\n      }\n    });\n\n    // Beim Drag Over (über andere Zeilen ziehen)\n    table.addEventListener('dragover', (e) => {\n      e.preventDefault(); // Notwendig, um das Drop-Ereignis zu ermöglichen\n      const targetRow = e.target.closest('tr');\n      if (targetRow && targetRow !== draggedRow) {\n        const rect = targetRow.getBoundingClientRect();\n        const middle = rect.top + rect.height / 2;\n        if (e.clientY > middle) {\n          targetRow.parentNode.insertBefore(draggedRow, targetRow.nextSibling);\n        } else {\n          targetRow.parentNode.insertBefore(draggedRow, targetRow);\n        }\n      }\n    });\n\n    // Nachdem der Drag abgeschlossen ist\n    table.addEventListener('dragend', (e) => {\n      e.target.style.display = ''; // Zeile wieder sichtbar machen\n      draggedRow = null;\n    });\n  </script>"},"style":{"left":"60px","top":"65px","width":"350px","height":"120px"},"widgetSet":"vis-jsontemplate"}]
                        

                        1 Reply Last reply Reply Quote 1
                        • I
                          iob69 @Codierknecht last edited by

                          @codierknecht
                          @OliverIO
                          Danke erst mal. Ich muss das erst mal durchdenken und ausprobieren. Melde mich ev. später wieder ... 😉

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          565
                          Online

                          32.2k
                          Users

                          80.9k
                          Topics

                          1.3m
                          Posts

                          3
                          16
                          127
                          Loading More Posts
                          • Oldest to Newest
                          • Newest to Oldest
                          • Most Votes
                          Reply
                          • Reply as topic
                          Log in to reply
                          Community
                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                          The ioBroker Community 2014-2023
                          logo