AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke HTML/JavaScript: Wie Grafik neu laden?
Thema durchsuchen
Ansicht
Themen-Optionen

HTML/JavaScript: Wie Grafik neu laden?

Ein Thema von Der schöne Günther · begonnen am 4. Jan 2022 · letzter Beitrag vom 5. Jan 2022
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

HTML/JavaScript: Wie Grafik neu laden?

  Alt 4. Jan 2022, 10:02
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

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. http://host/img.png?12345, die Zahl hinten immer weiter hochzählen und so den Browser-Cache "austricksen".

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"?
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
741 Beiträge
 
#2

AW: HTML/JavaScript: Wie Grafik neu laden?

  Alt 4. Jan 2022, 10:22
Schau mal hier
  Mit Zitat antworten Zitat
v2afrank

Registriert seit: 9. Mai 2005
Ort: Bocholt
573 Beiträge
 
Delphi XE2 Professional
 
#3

AW: HTML/JavaScript: Wie Grafik neu laden?

  Alt 5. Jan 2022, 06:54
Funktioniert denn nicht so etwas ?
<img class="myImg" >
<src>
window.settimeout(function(){document.getElementBy Id('batteryID').src ="/IMG"; },1000);
</src>

Geändert von v2afrank ( 5. Jan 2022 um 06:59 Uhr)
  Mit Zitat antworten Zitat
SebastianZ

Registriert seit: 23. Jul 2009
89 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: HTML/JavaScript: Wie Grafik neu laden?

  Alt 5. Jan 2022, 08:43
...

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"?
Der Browser-Cache ist auch im Jahr 2022 ein Ding, mit dem man umgehen muss
Es gibt afaik grundsätzlich 2 Wege um das zu lösen:

1. Du deaktivierst den Browser-Cache (https://cristian.sulea.net/blog/disa...eta-html-tags/) und lädst die komplette Seite wieder neu.
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: https://instructobit.com/tutorial/11...ing-Javascript)
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.051 Beiträge
 
Delphi 2009 Professional
 
#5

AW: HTML/JavaScript: Wie Grafik neu laden?

  Alt 5. Jan 2022, 17:04
Überall liest man, man solle die URL verändern in z.B. http://host/img.png?12345, die Zahl hinten immer weiter hochzählen und so den Browser-Cache "austricksen".
Ich denke, das ist wirklich das einzige, was geht, außer man kann auf dem Server die Cachelebenszeit der Grafik ändern und der Browser frag sie auch dann an, wenn man den src kurz auf leer oder so ändert.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: HTML/JavaScript: Wie Grafik neu laden?

  Alt 5. Jan 2022, 17:49
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 no-store, must-revalidate gesetzt, und es tut was es soll.

Mein gesamtes JavaScript sieht so aus:
Code:
document.addEventListener(
   "DOMContentLoaded",
   function(event) { 
      init();
   }
);

function init() {
   setInterval(
      function() {
         var imgSrc = String(document.getElementById("img").src);
         document.getElementById("img").src = imgSrc;
      },
      1000
   )
}
Der gesamte Teil vom Delphi-Server sieht so aus:
Delphi-Quellcode:
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;
Der Internet Explorer tut mal wieder nicht was er soll, aber das ist dann auch egal
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz