Asynchroniczne wczytywanie obrazków

Asynchroniczne wczytywanie obrazków
Waran3
  • Rejestracja:około 4 lata
  • Ostatnio:około rok
  • Lokalizacja:Zielonka
  • Postów:103
0

Nie chciałem zadawać tego pytania ale walczę już z tym klika godzin...:-)
Chciałbym wyświetlać wynik czytania pliku z serwera w jednym miejscu na stronie.
W php pracuje pętla, która czyta zawartość pliku i wyświetla jego treść ( aktualnie to "1")
Chodzi o to żeby ta treść wyświetlała się ciągle w jednym miejscu.
Myślałem, że załatwi to \r czyli powrót karetki...

Kopiuj
<?php

echo "Wynik = ";
for ($x=1; $x<10; $x++){
$fp = fopen("kotlin/wynik.txt", "r");
$tekst = fread($fp,1);
echo "$tekst\r";
fclose($fp);
}

?>

Aktualnie wygląda to tak:
screenshot-20220529203013.png
a chciałbym żeby wyglądało tak:
Wynik = 1

Docelowo pętla ma chodzić w nieskończoność sprawdzając zawartość pliku.

Miłe podpowiedzi będą mile widziane :-)


edytowany 3x, ostatnio: Riddle
SW
  • Rejestracja:około 5 lat
  • Ostatnio:3 miesiące
  • Postów:250
2

A wiesz jak działa http i żądanie - odpowiedź? :) Nie możesz wprost napisać nieskończonej pętli w php i liczyć na to, że teskt sam się będzie aktualizował na stronie, przynajmniej nie jest to tak trywialne jak Ci się może wydawać. Najprościej dodać do strony skrypt JS odpytujący co interwał skrypt php o dane.

Waran3
Trywialne wydawało mi się to dzisiaj rano, wieczorem już nie. :-) Dzięki za podpowiedź.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
2

Zadziałałoby to, gdybyś uruchamiał ten program z konsoli, no tak

Kopiuj
php index.php

Ale ponieważ Ty mówisz o aplikacji webowej, która składa się z klienta i servera, to musisz o tym pomyśleć w kontekście wysyłania danych przez sieć, np na socketach lub przez HTTP, i każda z tych technologii ma swoje wady i zalety.

edytowany 1x, ostatnio: Riddle
Waran3
  • Rejestracja:około 4 lata
  • Ostatnio:około rok
  • Lokalizacja:Zielonka
  • Postów:103
0

Teraz potrzebuję zrobić to jak najprościej. Nic nie mówię o aplikacji webowej, :-) to pomysły innych. Moim zdaniem najprościej będzie zrobić stronę www. Pliki czytam z tego samego serwera, na którym będzie strona, więc dokładnie właśnie tak jak piszesz - index.php. Na podstawie danych z pliku ( plików), które będą zapisywane za pomocą tabletów właśnie na tym serwerze, będę wyświetlał proste informacje. Strona służy jednie jako wyświetlacz. Ponieważ nie wiem kiedy dane zostaną zapisane muszę je kontrolować niejako przez cały czas, stąd pomysł pętli, która czyta plik, w którym w pewnym momencie pojawi się zapis..np. cyfra 1. To uruchomi dalsze działanie. Będę potrzebował tez podmieniać zdjęcia na stronie i na to nie mam dobrego pomysłu. Przydał by się jakiś panel administarcyjny. Póki co po prostu mam zamiar podmieniać pliki , gdzieś bokiem, przez ftpa czy jakoś tak. ;-)
Wiem, że można lepiej ale dopiero się uczę, więc jest jak jest :-)

Najprościej dodać do strony skrypt JS odpytujący co interwał skrypt php o dane.

Tak czy siak bez pętli się nie obejdzie...chyba :-) bo jak zrealizować inaczej ten interwał ?


edytowany 4x, ostatnio: Riddle
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
0

Pętla napiernioczajaca w plik, ftp, co pomysł to genialniejszy

ps. powiedz klientowi, ze fucha cię przerosła
https://4programmers.net/Forum/Mobilne/360255-kotlin_przekazywanie_zmiennych_miedzy_funkcjami?p=1839581#id1839581


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
edytowany 1x, ostatnio: ZrobieDobrze
Waran3
  • Rejestracja:około 4 lata
  • Ostatnio:około rok
  • Lokalizacja:Zielonka
  • Postów:103
0

ps. powiedz klientowi, ze fucha cię przerosła

Chciałbyś ;-)
Dawaj lepiej jakieś sensowniejsze rozwiązanie zamiast dołować kolegę. ;-)
A pomysły...no cóż, to moja specjalność. :-)


edytowany 3x, ostatnio: Waran3
AN
  • Rejestracja:prawie 19 lat
  • Ostatnio:około 6 godzin
1

Moim zdaniem, można tak podejść do sprawy:

Po stronie serwera w skrypcie PHP powinien być jeden odczyt pliku i wyświetlenie wyniku (bez pętli). W takim razie wywołanie pliku index.php spowoduje wyświetlenie informacji aktualnej na moment uruchomienia adresu tej strony. Potem, już w HTML, umieszczasz wywołanie JavaScript, które w czasie np. 10 sekund od wyświetlenia strony wywoła ponownie adres, co spowoduje zaktualizowanie informacji.

W niektórych przeglądarkach może być problem z cache, że informacja aktualizuje się tylko przy naciśnięciu Ctrl+F5, a w pozostałych przypadkach już nie. Mozna to obejść poprzez generowanie sztucznych parametrów GET, np. index.php?dummy=123, gdzie w miejscu 123 podajesz kolejny numer, losowy ciąg znaków, lub bieżąca godzinę z sekundnikiem, przy czym bierzesz same cyfry z zapisu. Wtedy przeglądarka będzie myślała, że za kazdym razem wywołujesz inną stronę, bo jest inny adres i nie skorzysta z cache.

edytowany 1x, ostatnio: andrzejlisek
Waran3
Super, dzięki.:-)
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
3
Waran3 napisał(a):

Teraz potrzebuję zrobić to jak najprościej. Nic nie mówię o aplikacji webowej, :-) to pomysły innych. Moim zdaniem najprościej będzie zrobić stronę www.

Przecież to jedno i to samo.

Siłą rzeczy masz backend i system plików tam, więc to aplikacja webowa. Ma jakieś zachowanie i integracje.

edytowany 1x, ostatnio: Riddle
Waran3
Hmm...czytałem że jednak nie :-) ale co ja tam wiem, to mój pierwszy raz z PHP :-)
KamilAdam
Ale aplikacja webowa brzmi bardziej dostojnie :P
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
1
Waran3 napisał(a):

Teraz potrzebuję zrobić to jak najprościej. Nic nie mówię o aplikacji webowej, :-) to pomysły innych. Moim zdaniem najprościej będzie zrobić stronę www. Pliki czytam z tego samego serwera, na którym będzie strona, więc dokładnie właśnie tak jak piszesz - index.php. Na podstawie danych z pliku ( plików), które będą zapisywane za pomocą tabletów właśnie na tym serwerze, będę wyświetlał proste informacje. Strona służy jednie jako wyświetlacz. Ponieważ nie wiem kiedy dane zostaną zapisane muszę je kontrolować niejako przez cały czas, stąd pomysł pętli, która czyta plik, w którym w pewnym momencie pojawi się zapis..np. cyfra 1. To uruchomi dalsze działanie. Będę potrzebował tez podmieniać zdjęcia na stronie i na to nie mam dobrego pomysłu. Przydał by się jakiś panel administarcyjny. Póki co po prostu mam zamiar podmieniać pliki , gdzieś bokiem, przez ftpa czy jakoś tak. ;-)
Wiem, że można lepiej ale dopiero się uczę, więc jest jak jest :-)

Masz jakieś spaczone podejście, bo powiedzenie "strona służy jedynie jako wyświetlacz" to ogromne uproszczenie.

Żadna pętla Ci tu nie pomoże, bo to nie jest tak że podmianka tych tekstów czy obrazków to jest jakiś "ciągły proces", tylko każda taka zmiana musi się wiązać z nowym requestem i response'm z servera, co w php znaczy mniej więcej to że każda taka podmianka to jest uruchomienie procesu php od nowa. Więc o żadnej pętli nie może być mowy w php. Co do js, to tam pętle są blokujące (synchroniczne) więc gdybyś odpalił taki kod pętli to nigdy byś nie zobaczył wyniku. Jedyna opcja to odpalić kod asynchronicznie, np poprzez setTimeout() albo setInterval().

Najprościej dodać do strony skrypt JS odpytujący co interwał skrypt php o dane.

Tak czy siak bez pętli się nie obejdzie...chyba :-) bo jak zrealizować inaczej ten interwał ?

No np przez setInterval().

No wysyłając nowe requesty z servera do klienta, lub klienta do servera - bo strona www to dwie osobne aplikacje. To co się pokazuje w przeglądarce to jeden program, to co się dzieje na serverze to drugi program.

Mówiłem Ci już - to jak Ty sobie wyobrażasz że by to działało ma szansę tak działać w konsoli, gdybyś uruchomił plik php lokalnie.

Najprościej będzie jak po prostu od początku napiszesz wszystkie elementy jak ta aplikacja ma działać, po kolei wszystko co chcesz zrobić. I wtedy Ci powiemy jak do tego najlepiej dojść.

edytowany 1x, ostatnio: Riddle
Waran3
  • Rejestracja:około 4 lata
  • Ostatnio:około rok
  • Lokalizacja:Zielonka
  • Postów:103
0

Przecież to jedno i to samo.

To nie zrozumiałem co miałeś na myśli pisząc...z konsoli.


edytowany 1x, ostatnio: Riddle
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0

Napisz dokładnie od początku do końca co ta aplikacja ma robić.

Waran3
  • Rejestracja:około 4 lata
  • Ostatnio:około rok
  • Lokalizacja:Zielonka
  • Postów:103
0

Dodaj cytat...Masz jakieś spaczone podejście, bo powiedzenie "strona służy jedynie jako wyświetlacz" to ogromne uproszczenie.

To nawet pewne :-)

Co do programu...
Potrzebuję Sprawdzać co jest w pliku na serwerze bo tam w pewnym momencie pojawi się wynik. Tak to jest teraz rozwiązane przeze mnie (ftp) - są głosy że tragicznie. :-) Gość na tablecie klika zapisz i w pliku wynik.txt pojawia się 1 lub 2. Ja teraz potrzebuję odczytać te wartości i w zależności od tego co tam jest, wyświetlić graficznie informacje.
Tablica w praktyce wygląda z grubsza tak:
screenshot-20220530105701.png

Podkreślam, że uczę się na tym projekcie, więc robię pewnie mnóstwo bzdur ale jak to podczas nauki...:-) więc prośba o wyrozumiałość.
To nie musi być super idealnie, w sensie że przeładować stronę można i ręcznie, przynajmniej w pierwszej wersji.

Jedyna opcja to odpalić kod asynchronicznie

No właśnie wczoraj zacząłem o tym czytać :-) ale jeszcze nie kumam. :-) Trafiłem na Node.js...ale nie wiem czy to nie za duża koparka do mojego problemu. W każdym razie jeszcze to rozkminiam.


edytowany 1x, ostatnio: Waran3
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
1
Waran3 napisał(a):

Potrzebuję Sprawdzać co jest w pliku na serwerze bo tam w pewnym momencie pojawi się wynik. Tak to jest teraz rozwiązane przeze mnie (ftp) - są głosy że tragicznie. :-) Gość na tablecie klika zapisz i w pliku wynik.txt pojawia się 1 lub 2. Ja teraz potrzebuję odczytać te wartości i w zależności od tego co tam jest, wyświetlić graficznie informacje.
Tablica w praktyce wygląda z grubsza tak:
screenshot-20220530105701.png

A ten FTP to musi to być to? Czy tak sobie wymyśliłeś?

Najlepiej to byłoby to zrobić na socketach, jeśli klient (przeglądarka), ma być powiadamiana o informacjach z servera. Ale to już jest trudniejsza technologia.

Dla Ciebie polecam zrobić tak.

  1. Zrób witrynę w index.html
  2. Napisz funkcje która umie odpytać backend o dane z pliku, np przez fetch().
  3. Napisz kodzik który umie zmieniać wyświetlane dane, np poprzez innerText
  4. Dodaj w niej kodzik JavaScript który co jakiś czas (5-10 sekund, np w setTimeout()) odpytuje backend o dane z pliku

To nie musi być super idealnie, w sensie że przeładować stronę można i ręcznie, przynajmniej w pierwszej wersji.

No to jeśli chcesz przeładować stronę ręcznie, to po prostu że zrobisz

Kopiuj
echo file_get_contents("plik.txt");

... i po sprawie. Wtedy masz jeden request, jeden response.

Jedyna opcja to odpalić kod asynchronicznie

No właśnie wczoraj zacząłem o tym czytać :-) ale jeszcze nie kumam. :-) Trafiłem na Node.js...ale nie wiem czy to nie za duża koparka do mojego problemu. W każdym razie jeszcze to rozkminiam.

Albo PHP albo node.js. Bez sensu używać obu.

edytowany 1x, ostatnio: Riddle
Waran3
Super! Wielkie dzięki.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
3
Waran3 napisał(a):

Super! Wielkie dzięki.

Mniej więcej tak:

index.html

Kopiuj
<html>
<body>
<span id="value"></span>

<script>
const span = document.getElementById("value");

fetchIteratively(data => {
  span.innerText = data.text;
});

function fetchIteratively(callback) {
  fetchValue(data => {
    callback(data);
    setTimeout(() => fetchIteratively(callback), 5000);
  });
}

function fetchValue(callback) {
  fetch('/values.php')
    .then(response => response.json())
    .then(data => callback(data));
}

</script>
</body>
</html>

Oraz values.php:

Kopiuj
if (file_exists("file.txt")) {
  $file = file_get_contents("file.txt");
}
else {
  $file = "";
}

echo json_encode(['text' => $file]);

Uzyłem setTimeout() zamiast setInterval(), z dwóch powodów:

  • Po pierwsze dlatego zeby czekanie na następny call zaczęło się dopiero po skończeniu pierwszego requestu (dzięki request nie poleci częściej niż raz na 5 sekund).
  • Po drugie dlatego, żeby fail w requeście (nieudany request) zakończył ładowanie.
edytowany 5x, ostatnio: Riddle
Zobacz pozostałe 2 komentarze
Riddle
Nie ma żadnej pętli, mówiłem Ci wielokroć już.
Waran3
Ok :-) Rozumiem, że funkcja z JS odpala co 5sek tego if,a z php. Tak przy okazji w if,ie jest chyba literówka( brak s ), powinno być $file = file_get_contents.
Riddle
Tak, pisałem z pamięci. Poprawione.
Waran3
Cały dzień rozkminiałem temat i wreszcie zadziałało. :-) Dzięki jeszcze raz.
Waran3
Pytanie uzupełniające. ;-) Wiadomo było.;-) Czy podobnie można zrobić ze zdjęciami. Czyli chciałbym podmieniać zdjęcia gdzieś w tle( ta sama nazwa nawet). Np. img1.jpg i img2.jpg. Czyli podmieniam pliki ale nazwy zostają, a strona wyświetla aktualne obrazki. Czy jest coś podobnego do innerText? To samo dotyczy div. Czy mogę dynamicznie( w zależności od otrzymanych danych z przeczytanego pliku) zmieniać np. kolor tła tego div,a?
CH
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 2 lata
  • Postów:449
1

zadnych petli. odpal server na node.js ktory ci odczytuje pliki i wyswietla dane na stronie bez zadnych tam odczytywan i petli
pewnie jakies 5 linijek kodu

edytowany 1x, ostatnio: chomikowski
Waran3
Myślę o tym ale trochę się obawiam instalacji na serwerze...Dopiero co odkryłem node.js i nie wiem czy nie spróbuję tego zrobić dopiero w drugim rzucie.
CH
dawaj teraz to jest banalne i az sam poiwiesz ze Łooooo. Odpalasz gotowego serwera w tle a na stronie robisz object Client i on ci odczytuje wszystko asynchronicznie i masz na stronie gotowe jak czat. ja tak czat robilem
Waran3
Ale ten serwer w tle, jak rozumiem musi chodzić na serwerze internetowym. Czyli muszę go odpalić gdzieś, gdzie mam swoja stronę. Czy czegoś znowu nie rozumiem ? :-) Pytam bo mam info, że tam gdzie mam hosting node.js nie działa...przynajmniej tak mi powiedzieli. :-)
CH
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 2 lata
  • Postów:449
0

@Waran3: w pierwszym poscie napisales "Chciałbym wyświetlać wynik czytania pliku z serwera" i wlasnie na tym serwerze instalujesz node.js i odpalasz serwer ktory sprawdza zawartosc pliku i wysyla do wszystkich podlaczononych klientow. ustalasz port np 3030 i na stronie html masz szkrypt JS laczacy sie na twoja strone:3030 i czeka az serwer wysle wiadomosc i aktualizuje ten wynik co oczekujsz.

Zobacz pozostałe 2 komentarze
Waran3
To hosting, czyli mam wykupione miejsce na serwerze. Zrozumiałem że to nie wystarczy.
CH
A nie, jak hosting to nie mamy o czym gadac, myslalem ze masz serwer. to w tym przypadku nic nie zrobisz
Waran3
Czyli fizycznie muszę mieć swój serwer...Widziałem tez, że są firmy, które udostępniają takie serwery.
CH
znaczy zwyczajnei kup sobie VPS
Waran3
Ok, dzięki. Dla mnie to bardzo istotne informacje :-)
Waran3
  • Rejestracja:około 4 lata
  • Ostatnio:około rok
  • Lokalizacja:Zielonka
  • Postów:103
0
Kopiuj
<script>
const span = document.getElementById("value");

fetchIteratively(data => {
  span.innerText = data.text;
});

Próbuję się odwołać do tego value w CSS,ie ale nie chce działać.:-)

Kopiuj
<link rel="stylesheet" href="style_mk.css">

Wklejone właściwości na szybko, tak żeby tylko sprawdzić czy jest jakaś reakcja na stronie.

Kopiuj
#value 
{
    position:absolute;
    background-color:red;
    display: inline-block;
    bottom: 107px;
    height: 70px;
    width: 200px;
    right:  370px;
    font-size: larger;
}

Działa, tylko trzeba było przeładować stronę...porządnie :-) Ctrl + F5.


edytowany 3x, ostatnio: Waran3
Waran3
  • Rejestracja:około 4 lata
  • Ostatnio:około rok
  • Lokalizacja:Zielonka
  • Postów:103
0

Ze zdjęciami mi nie idzie...

Kopiuj
<button id="get-btn" type="button"> Przycisk</button>
 <div id="blok"><img src="breck_2.jpg"></div>
Kopiuj
var blok = document.getElementById("blok")
function zmien(src){
blok.innerHTML="<img src='"+src+"'>";
}

document.getElementById('get-btn').addEventListener('click',zmien); // przycisk wywołujacy funkcję

Strona po uruchomieniu oczywiście wyświetla breck_2.jpg ale po kliknięciu w button wyświetla się brak obrazka.
screenshot-20220602185403.png

A takie komunikaty mam na konsoli:
screenshot-20220602185519.png


edytowany 1x, ostatnio: Waran3
CH
bo element blok nie ma atrybutu src tylko jest puste musisz albo przeniesc id=blok do tagu IMG albo w tagu img zrobic id="papa" i zmienic document.getElementById("papa")
Riddle
Nie używaj innerHTML! Tylko document.createElement()
Waran3
papa :-) podziałało ale nie odświeża obrazka. Muszę przeładować stronę. Sprawdzę jak z tym document.createElement().
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0
Waran3 napisał(a):

Ze zdjęciami mi nie idzie...

Kopiuj
<button id="get-btn" type="button"> Przycisk</button>
 <div id="blok"><img src="breck_2.jpg"></div>
Kopiuj
var blok = document.getElementById("blok")
function zmien(src){
blok.innerHTML="<img src='"+src+"'>";
}

document.getElementById('get-btn').addEventListener('click',zmien); // przycisk wywołujacy funkcję

Strona po uruchomieniu oczywiście wyświetla breck_2.jpg ale po kliknięciu w button wyświetla się brak obrazka.
screenshot-20220602185403.png

A takie komunikaty mam na konsoli:
screenshot-20220602185519.png

Ale jaki konkretne chciałbyś tamsrc wstawić?

Waran3
Chciałbym móc podmienić pliki, tak jak z tekstem. Czyli jest obrazek1.jpg , podmieniam go (fizycznie) na inny obrazek1.jpg i strona wyświetla za chwilę ten nowy ( bez przeładowywania ).
Riddle
A po co chcesz podmienić obrazek na ten sam? Chodzi Ci o to że chcesz wczytać ten obrazek ponownie? Czy chcesz mieć dwa takie same?
Waran3
Obrazki są inne ale nazwa ta sama. Ma to działać docelowo tak: robię fotkę telefonem i wysyłam na serwer ( tak jak z plikami). Strona odczytuje nową fotkę i ją wyświetla. Pewnie w pierwszym etapie po prostu podmienię pliki na serwerze zwyczajnie je kopiując.
Riddle
Ale wiesz że 99% przeglądarek Ci zcache'uje pliki o takiej samej nazwie i ścieżce? Musiałbyś ustawić specjalnego rule'a w header'ach, żeby nie cache'owało albo ręcznie inwalidować cache. Czemu różne obrazki nie mogą mieć różnej nazwy?
Waran3
Pewnie , że nie wiem - pewnie dlatego ta pierwsza wersja z innerHTML nie chciała dobrze działać ;-) Chodzi o to żeby strona wiedziała, że jest nowy obrazek i teraz jego trzeba wyświetlić. Myślałem, że można zrobić to na wzór tego czytania tekstu, czyli co jakiś czas wczytać obrazek o tej samej nazwie ale skoro jest cache to trzeb to zrobić jakoś inaczej...
Waran3
  • Rejestracja:około 4 lata
  • Ostatnio:około rok
  • Lokalizacja:Zielonka
  • Postów:103
0

No cóż, w JS "programuję" od 3 dni " więc mam problemy z napisaniem sensownego kodu :-)

Kopiuj
<button id="get-btn" type="button"> Przycisk</button>

<div id="img"><img id="img" src="breck_1.jpg"></div> // kompletnie się tutaj pogubiłem

Kopiuj
var newImg = document.createElement("img")
function zmien(img){
newImg.src="breck_1.jpg"
}


CH
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 2 lata
  • Postów:449
0

nie wiadomo co chcesz osisagnac jesli masz guzxik zaladuj obrazek to wczytujesz plik i wyswietlasz obrazek jako base64 i dopiero potem ktos klika zapisz i go zapisujesz jako plik. bo jak sie komus nie spodoba obrazek to musisz zrobic i tak funkcje usun (obrazek z serwera i z podgladu)

Waran3
Chodzi o to żeby strona wiedziała, że jest nowy obrazek i teraz jego trzeba wyświetlić. Myślałem, że można zrobić to na wzór tego czytania tekstu, czyli co jakiś czas wczytać obrazek o tej samej nazwie ale skoro jest cache to trzeb to zrobić jakoś inaczej...Nie pomyślałem o tym że trzeba usuwać z podglądu. Myślałem że jedno zastąpi drugie. No i nie wiem co to jest base64 :-) Na stronie nikt nic ma nie klikać to jedynie inteligentny wyświetlacz ma być.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0

@Waran3: no to możesz albo ustawić header odpowiedni i rypać się z tym żeby przeglądarka go nie cache'owała, albo ustawić inne nazwy plików.

No jeszcze ewentualnie możesz zrobić taki trick, że masz zmienną

Kopiuj
let i;

i robisz potem

Kopiuj
i = i + 1;

I jak potem wczytujesz obrazek to robisz np obrazek.jpg?x=1, obrazek.jpg?x=2, obrazek.jpg?x=3.

Rozne parametry większość przeglądarek nie uznaje jako jeden zasób, możesz tak obejść te same nazwy.

Tylko pamiętaj że cache też jest po coś. Jest po to żeby oszczędzić transfer, zwiększyć performance, i ogólnie zoptymalizować aplikacje. Psując cache takimi trickami, pozbywasz się tego.

Czy na prawdę to musi być obrazek o tej samej nazwie? Czemu?

edytowany 1x, ostatnio: Riddle
Waran3
Nie musi być o tej samej...ważne żeby wskoczył na to samo miejsce co ten pierwszy. Tylko nie wiem jak to zakomunikować przeglądarce że ma to akurat zrobić teraz. Strona to jedynie wyświetlacz, nikt tam nie będzie klikał. :-) i tylko jeden komputer będzie ją wyświetlał.
Waran3
  • Rejestracja:około 4 lata
  • Ostatnio:około rok
  • Lokalizacja:Zielonka
  • Postów:103
0

Strona z grubsza będzie wyglądała tak:
screenshot-20220602201938.png

Będę potrzebował wymieniać te dwa zdjęcia podczas zawodów.
No i kombinuję jak to zrobić najlepiej i najprościej.
Spodobało mi się to asynchroniczne czytanie danych i dlatego pomyślałem o tym w kontekście zdjęć.
Oczywiście w ostateczności mogę przeładować stronę ręcznie...ale chciał bym być bardziej profi :-)


edytowany 4x, ostatnio: Waran3
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0

@Waran3: a to zawsze będzie kolekcja kilku obrazów dostarczonych przez Ciebie? Czy mogą być najróżniejsze?

Waran3
Zdjęcia robi się zawodnikom podczas turnieju.Bo nie wiadomo kto będzie w finale. Dlatego docelowo chcę żeby to leciało bezpośrednio z telefonu.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0

Zdjęcia robi się zawodnikom podczas turnieju.Bo nie wiadomo kto będzie w finale. Dlatego docelowo chcę żeby to leciało bezpośrednio z telefonu

No to moim zdaniem najlepiej by było gdyby każde wrzucone zdjęcie miało inną nazwę. Albo aktualną datę albo najlepiej md5 obrazka, lub jakąś checksuma. Potem zapisałbyś nazwy obrazków które mają się wyświetlić na stronie w pliku images.json. Potem Twój js co jakiś czas by wczytywał te plik, i ładował te obrazki które są w tym pliku.

Waran3
Brzmi nieźle...:-) Tylko nie wiem jak dać znać programowi żeby wiedział co i kiedy wyświetlić.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
1
Waran3 napisał(a):

Brzmi nieźle...:-) Tylko nie wiem jak dać znać programowi żeby wiedział co i kiedy wyświetlić

No odpal setTimeout() co 5 sekund, wczytuj fetch("images.json"), zrób response => response.json(), pobierz adresy obrazków, i ustaw go image.src = .

Waran3
Rozumiem, że obrazki będą miały inne adresy i że co 5 sek jest odczyt ale żeby wyświetlić odpowiednie, muszę coś zrobić...I pytanie jest co ? :-) Może kliknięcie na obrazek powodowało by wyświetlenie następnego. Chociaż wolał bym to robić gdzieś w tle. . Albo czegoś nie rozumiem co piszesz. :-)To akurat jest bardzo prawdopodobne ;-)
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0
Waran3 napisał(a):

Rozumiem, że obrazki będą miały inne adresy i że co 5 sek jest odczyt ale żeby wyświetlić odpowiednie, muszę coś zrobić...I pytanie jest co ? :-) Może kliknięcie na obrazek powodowało by wyświetlenie następnego. Chociaż wolał bym to robić gdzieś w tle. . Albo czegoś nie rozumiem co piszesz. :-)To akurat jest bardzo prawdopodobne ;-)

No przecież mówię CI:

TomRiddle napisał(a):

No odpal setTimeout() co 5 sekund, wczytuj fetch("images.json"), zrób response => response.json(), pobierz adresy obrazków, i ustaw go image.src = .

Zobacz pozostałe 2 komentarze
Waran3
To rozumiem ale skąd program wie że ma załadować nowy obrazek skoro nazwy są różne?
Riddle
Wczyta go z pliku images.json.
Waran3
Czyli aktualnie przesłany obrazek...i tak nie kumam do końca bo nie wiem skąd program wie, że obrazek jest aktualny. Rozumiem że w image.json jest aktualny plik, a tego poprzedniego już nie ma...
Riddle
A po co Ci "poprzedni obrazek"? W images.json możesz sobie trzymać jaki tylko obrazek chcesz, i ile ich chcesz.
Waran3
Ja to rozumiem ale muszę mu jakoś powiedzieć, które obrazki chcę w nim trzymać.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0

Najpierw masz takie pliki na serverze:

  • image1.png
    image2.png
    images.json z treścią
    Kopiuj
    {
      images: ["image1.png", "image2.png"]
    }
    

Program wczytuje plik images.json, wczytuje z niego ["image1.png", "image2.png"] i wczytuje te pliki. Odświeża potem co 5 sekund ten plik images.json, i obrazki są takie same.

Potem ktoś wchodzi, dodaje nowe dwa zdjęcia, więc pliki wyglądają tak:

  • image1.png
    image2.png
    image2.png
    image4.png
    images.json z treścią
    Kopiuj
    {
      images: ["image3.png", "image4.png"]
    }
    

Program znów wczytuje plik images.json, i wyświetla te dwa obrazki.

edytowany 1x, ostatnio: Riddle
Zobacz pozostałe 3 komentarze
Waran3
Mój był łatwiejszy...podmieniam pliki i po kłopcie :-) Kwestia tylko tego odświeżania :-)
Riddle
@Waran3: Tylko jakoś musisz dać znać przeglądarce że się zmieniły. Albo usunąć cache, albo dopisać header, albo dodać parametr w URL'u, bo inaczej będzie zcache'owany. Mówiłem Ci, że przeglądarki traktują pliki jak zasoby - jeśli mają taki sam path i nazwę, to przeglądarka traktuje je jak ten sam plik.
Waran3
Rozumiem ale chyba to będzie dla mnie łatwiejsze niż pisanie na aktualnym moim etapie funkcji z collbackiem, jsonem itp. ;-) Choć dzięki temu szybciej się uczę :-)
Waran3
images: ["image3.png", "image4.png"] - czyli, że to będę musiał wpisać ręcznie....
Waran3
Kurcze nie umiem tego zrobić: " pobierz adresy obrazków, i ustaw go image.src = ."
Waran3
  • Rejestracja:około 4 lata
  • Ostatnio:około rok
  • Lokalizacja:Zielonka
  • Postów:103
0

W sumie skorzystałem z poprzedniego kodu:

Kopiuj
function fetchValue(callback) {
  fetch("images.json")
    .then(response => response.json())
    .then(data => callback(data));
    console.log(span)

}


// nie wiem jak tutaj...
fetchIteratively(data => {
  span.innerText = data.json ;
  });
Kopiuj
{
    "images": ["breck_1.jpg", "breck_2.jpg"] 
}

Ale nie wiem co dalej, jak odczytać adresy plików.


edytowany 1x, ostatnio: Riddle
Riddle
const adresy = data.images;
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0
Waran3 napisał(a):

Ale nie wiem co dalej, jak odczytać adresy plików.

Musisz w jakiś dowolny sposób, dać przeglądarce znać że Twój obrazek się zmienił:

  • Sposób #1: Albo wysłać header'y, prosząc o nie cache'owanie obrazków (tylko wtedy praktycznie wyłączasz ich cache, i będą często ładowane te same dane)

  • Sposób #2: Albo załadować obrazki z parametrami

  • Sposób #3: Albo nadać obrazkom różne nazwy - to jest najlepsze wyjście

    Ale jeśli nadasz im różne nazwy, to musisz je jakoś wczytać - te nazwy. Tutaj wkracza JSON, zapisujesz w nim nazwy obrazków, potem strona wczytuje ten plik, mówi: "oho, takie są nowe nazwy obrazków", i wczytuje je.

Nie wiem jak na to wpadłeś, ale umieszczanie na serverze różnych obrazków pod tą samą nazwą, to proszenie się o kłopoty. Można by to zrobić, gdybyś chciał zmienić coś nieistotnego, jakiś cień, metodę kompresji, format - bo wtedy użytkownik strony i tak nie zauważy różnicy. Ale Ty chcesz wyświetlić różne obrazki, musisz więc w aktywny sposób zadziałać żeby je podmienić, jednym z trzech sposobów które wymieniłem.

edytowany 2x, ostatnio: Riddle
Waran3
Ok, siedzę nad tym.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)