![]() |
HTML/JavaScript: Wie Grafik neu laden?
Ich habe einen simplen Indy-Http-Server der ein paar Status & Sensor-Werte anzeigt.
Ich habe jetzt eine Grafik hinzugefügt: Der Http-Server liefert das HTML wenn man ihn mit GET / aufruft und ein dynamisch generiertes PNG-Bild wenn er per http mit GET /IMG angesprochen wird. Auf meiner HTML-Seite packe ich nun ein <img src="/IMG" /> und sehe im Browser die Grafik. Tolle Sache :thumb: Jetzt möchte ich den Benutzer nicht ständig F5 drücken lassen, sondern per JavaScript das Bild im Sekundentakt aktualisieren. Einen JavaScript-Timer bekomme ich hin, auch z.B. reine Textbausteine zu aktualisieren ist kein Problem. Ich tue mich schwer mit dem <img>: Überall liest man, man solle die URL verändern in z.B. ![]() Das kann doch im Jahr 2022 keine erst gemeinte Lösung sein. Vor allem nicht, da ich hier ja auch den Server kontrolliere und in meinem Indy-Server auch Cache und alles einstellen kann. Wie macht man es "richtig"? |
AW: HTML/JavaScript: Wie Grafik neu laden?
Schau mal
![]() |
AW: HTML/JavaScript: Wie Grafik neu laden?
Funktioniert denn nicht so etwas ?
<img class="myImg" > <src> window.settimeout(function(){document.getElementBy Id('batteryID').src ="/IMG"; },1000); </src> |
AW: HTML/JavaScript: Wie Grafik neu laden?
Zitat:
Es gibt afaik grundsätzlich 2 Wege um das zu lösen: 1. Du deaktivierst den Browser-Cache ( ![]() 2 (der hübschere Weg, da du nicht ständig alles laden musst): Du änderst via Javascript die SRC im Bild. Wenn das Bild die gleiche URL hat, muss du es über einen "Parameter" dazu bringen es wie neu aussehen zu lassen. Ansonsten würde sich für den Browser nichts ändern und er würde das Bild nicht neu laden. Am einfachsten finde ich persönlich, wenn man am Ende einfach Datum/Uhrzeit anfügt, dann muss man sich nicht ums hochzählen kümmern. (Ein Beispiel von vielen: ![]() |
AW: HTML/JavaScript: Wie Grafik neu laden?
Zitat:
|
AW: HTML/JavaScript: Wie Grafik neu laden?
Vielen Dank für die Antworten.
Nein, ich weigere mich, an die URL irgendeinen Buchstabensalat dran zu hängen und darauf zu hoffen, dass der Browser das tut, was ich mir wünsche. Ich habe in der Antwort vom Server den Cache nun auf
Delphi-Quellcode:
gesetzt, und es tut was es soll.
no-store, must-revalidate
Mein gesamtes JavaScript sieht so aus:
Code:
Der gesamte Teil vom Delphi-Server sieht so aus:
document.addEventListener(
"DOMContentLoaded", function(event) { init(); } ); function init() { setInterval( function() { var imgSrc = String(document.getElementById("img").src); document.getElementById("img").src = imgSrc; }, 1000 ) }
Delphi-Quellcode:
Der Internet Explorer tut mal wieder nicht was er soll, aber das ist dann auch egal 8-)
procedure TImageReplyGenerator.generateReply(
const request: TIdHTTPRequestInfo; const response: TIdHTTPResponseInfo ); begin response.ContentStream := getPngStream(); try response.ContentType := 'image/png'; response.FreeContentStream := False; response.CacheControl := 'no-store, must-revalidate'; // siehe https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control response.Expires := Now(); response.LastModified := Now(); except response.ContentStream.Free(); response.ContentStream := nil; raise; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz